Fossil

Hex Artifact Content
Login

Artifact 69d8909e1b87707b6b53d27705aa40353c63e555:


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 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
0470: 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 74 61 74  ** The file stat
0480: 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  us information f
0490: 72 6f 6d 20 74 68 65 20 6d 6f 73 74 20 72 65 63  rom the most rec
04a0: 65 6e 74 20 73 74 61 74 28 29 20 63 61 6c 6c 2e  ent stat() call.
04b0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 5f 73 74 61 74  .**.** Use _stat
04c0: 69 36 34 20 72 61 74 68 65 72 20 74 68 61 6e 20  i64 rather than 
04d0: 73 74 61 74 20 6f 6e 20 77 69 6e 64 6f 77 73 2c  stat on windows,
04e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 68 61 6e   in order to han
04f0: 64 6c 65 20 66 69 6c 65 73 0a 2a 2a 20 6c 61 72  dle files.** lar
0500: 67 65 72 20 74 68 61 6e 20 32 47 42 2e 0a 2a 2f  ger than 2GB..*/
0510: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
0520: 4e 33 32 29 20 26 26 20 28 64 65 66 69 6e 65 64  N32) && (defined
0530: 28 5f 5f 4d 53 56 43 52 54 5f 5f 29 20 7c 7c 20  (__MSVCRT__) || 
0540: 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52  defined(_MSC_VER
0550: 29 29 0a 23 20 75 6e 64 65 66 20 73 74 61 74 0a  )).# undef stat.
0560: 23 20 64 65 66 69 6e 65 20 73 74 61 74 20 5f 73  # define stat _s
0570: 74 61 74 69 36 34 0a 23 65 6e 64 69 66 0a 2f 2a  tati64.#endif./*
0580: 0a 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 53  .** On Windows S
0590: 5f 49 53 4c 4e 4b 20 61 6c 77 61 79 73 20 72 65  _ISLNK always re
05a0: 74 75 72 6e 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a  turns FALSE..*/.
05b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 5f 49  #if !defined(S_I
05c0: 53 4c 4e 4b 29 0a 23 20 64 65 66 69 6e 65 20 53  SLNK).# define S
05d0: 5f 49 53 4c 4e 4b 28 78 29 20 28 30 29 0a 23 65  _ISLNK(x) (0).#e
05e0: 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
05f0: 66 69 6c 65 53 74 61 74 56 61 6c 69 64 20 3d 20  fileStatValid = 
0600: 30 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  0;.static struct
0610: 20 73 74 61 74 20 66 69 6c 65 53 74 61 74 3b 0a   stat fileStat;.
0620: 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 73 74 61 74  ./*.** Fill stat
0630: 20 62 75 66 20 77 69 74 68 20 69 6e 66 6f 72 6d   buf with inform
0640: 61 74 69 6f 6e 20 72 65 63 65 69 76 65 64 20 66  ation received f
0650: 72 6f 6d 20 73 74 61 74 28 29 20 6f 72 20 6c 73  rom stat() or ls
0660: 74 61 74 28 29 2e 0a 2a 2a 20 6c 73 74 61 74 28  tat()..** lstat(
0670: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 55  ) is called on U
0680: 6e 69 78 20 69 66 20 69 73 57 64 20 69 73 20 54  nix if isWd is T
0690: 52 55 45 20 61 6e 64 20 61 6c 6c 6f 77 2d 73 79  RUE and allow-sy
06a0: 6d 6c 69 6e 6b 73 20 73 65 74 74 69 6e 67 20 69  mlinks setting i
06b0: 73 20 6f 6e 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  s on..**.*/.stat
06c0: 69 63 20 69 6e 74 20 66 6f 73 73 69 6c 5f 73 74  ic int fossil_st
06d0: 61 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  at(const char *z
06e0: 46 69 6c 65 6e 61 6d 65 2c 20 73 74 72 75 63 74  Filename, struct
06f0: 20 73 74 61 74 20 2a 62 75 66 2c 20 69 6e 74 20   stat *buf, int 
0700: 69 73 57 64 29 7b 0a 23 69 66 20 21 64 65 66 69  isWd){.#if !defi
0710: 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 69 66  ned(_WIN32).  if
0720: 28 20 69 73 57 64 20 26 26 20 67 2e 61 6c 6c 6f  ( isWd && g.allo
0730: 77 53 79 6d 6c 69 6e 6b 73 20 29 7b 0a 20 20 20  wSymlinks ){.   
0740: 20 72 65 74 75 72 6e 20 6c 73 74 61 74 28 7a 46   return lstat(zF
0750: 69 6c 65 6e 61 6d 65 2c 20 62 75 66 29 3b 0a 20  ilename, buf);. 
0760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
0770: 72 6e 20 73 74 61 74 28 7a 46 69 6c 65 6e 61 6d  rn stat(zFilenam
0780: 65 2c 20 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  e, buf);.  }.#el
0790: 73 65 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  se.  int rc = 0;
07a0: 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 4d 62 63  .  wchar_t *zMbc
07b0: 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f  s = fossil_utf8_
07c0: 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65  to_unicode(zFile
07d0: 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77  name);.  rc = _w
07e0: 73 74 61 74 69 36 34 28 7a 4d 62 63 73 2c 20 62  stati64(zMbcs, b
07f0: 75 66 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 6d 62  uf);.  fossil_mb
0800: 63 73 5f 66 72 65 65 28 7a 4d 62 63 73 29 3b 0a  cs_free(zMbcs);.
0810: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
0820: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  dif.}../*.** Fil
0830: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 53 74 61  l in the fileSta
0840: 74 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  t variable for t
0850: 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 7a 46  he file named zF
0860: 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 7a  ilename..** If z
0870: 46 69 6c 65 6e 61 6d 65 3d 3d 30 2c 20 74 68 65  Filename==0, the
0880: 6e 20 75 73 65 20 74 68 65 20 70 72 65 76 69 6f  n use the previo
0890: 75 73 20 76 61 6c 75 65 20 6f 66 20 66 69 6c 65  us value of file
08a0: 53 74 61 74 20 69 66 0a 2a 2a 20 74 68 65 72 65  Stat if.** there
08b0: 20 69 73 20 61 20 70 72 65 76 69 6f 75 73 20 76   is a previous v
08c0: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  alue..**.** If i
08d0: 73 57 64 20 69 73 20 54 52 55 45 2c 20 64 6f 20  sWd is TRUE, do 
08e0: 6c 73 74 61 74 28 29 20 69 6e 73 74 65 61 64 20  lstat() instead 
08f0: 6f 66 20 73 74 61 74 28 29 20 69 66 20 61 6c 6c  of stat() if all
0900: 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 69 73 20 6f  ow-symlinks is o
0910: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  n..**.** Return 
0920: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
0930: 72 6f 72 73 2e 20 20 4e 6f 20 65 72 72 6f 72 20  rors.  No error 
0940: 6d 65 73 73 61 67 65 73 20 61 72 65 20 67 65 6e  messages are gen
0950: 65 72 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erated..*/.stati
0960: 63 20 69 6e 74 20 67 65 74 53 74 61 74 28 63 6f  c int getStat(co
0970: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
0980: 61 6d 65 2c 20 69 6e 74 20 69 73 57 64 29 7b 0a  ame, int isWd){.
0990: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
09a0: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
09b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 66 69 6c 65   ){.    if( file
09c0: 53 74 61 74 56 61 6c 69 64 3d 3d 30 20 29 20 72  StatValid==0 ) r
09d0: 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 1;.  }else{.
09e0: 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73      if( fossil_s
09f0: 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  tat(zFilename, &
0a00: 66 69 6c 65 53 74 61 74 2c 20 69 73 57 64 29 21  fileStat, isWd)!
0a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 69 6c 65  =0 ){.      file
0a20: 53 74 61 74 56 61 6c 69 64 20 3d 20 30 3b 0a 20  StatValid = 0;. 
0a30: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
0a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 69   }else{.      fi
0a50: 6c 65 53 74 61 74 56 61 6c 69 64 20 3d 20 31 3b  leStatValid = 1;
0a60: 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
0a70: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0a80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
0a90: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
0aa0: 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
0ab0: 73 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  s.  Return -1 if
0ac0: 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
0ad0: 6f 74 0a 2a 2a 20 65 78 69 73 74 2e 20 20 49 66  ot.** exist.  If
0ae0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
0af0: 4c 4c 2c 20 72 65 74 75 72 6e 20 74 68 65 20 73  LL, return the s
0b00: 69 7a 65 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ize of the most 
0b10: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 73 74 61 74  recently.** stat
0b20: 2d 65 64 20 66 69 6c 65 2e 0a 2a 2f 0a 69 36 34  -ed file..*/.i64
0b30: 20 66 69 6c 65 5f 73 69 7a 65 28 63 6f 6e 73 74   file_size(const
0b40: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
0b50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
0b60: 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  tat(zFilename, 0
0b70: 29 20 3f 20 2d 31 20 3a 20 66 69 6c 65 53 74 61  ) ? -1 : fileSta
0b80: 74 2e 73 74 5f 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a  t.st_size;.}../*
0b90: 0a 2a 2a 20 53 61 6d 65 20 61 73 20 66 69 6c 65  .** Same as file
0ba0: 5f 73 69 7a 65 28 29 2c 20 62 75 74 20 74 61 6b  _size(), but tak
0bb0: 65 73 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20  es into account 
0bc0: 73 79 6d 6c 69 6e 6b 73 2e 0a 2a 2f 0a 69 36 34  symlinks..*/.i64
0bd0: 20 66 69 6c 65 5f 77 64 5f 73 69 7a 65 28 63 6f   file_wd_size(co
0be0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
0bf0: 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  ame){.  return g
0c00: 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65  etStat(zFilename
0c10: 2c 20 31 29 20 3f 20 2d 31 20 3a 20 66 69 6c 65  , 1) ? -1 : file
0c20: 53 74 61 74 2e 73 74 5f 73 69 7a 65 3b 0a 7d 0a  Stat.st_size;.}.
0c30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0c40: 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74  e modification t
0c50: 69 6d 65 20 66 6f 72 20 61 20 66 69 6c 65 2e 20  ime for a file. 
0c60: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
0c70: 65 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  e file.** does n
0c80: 6f 74 20 65 78 69 73 74 2e 20 20 49 66 20 7a 46  ot exist.  If zF
0c90: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
0ca0: 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  return the size 
0cb0: 6f 66 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 72  of the most.** r
0cc0: 65 63 65 6e 74 6c 79 20 73 74 61 74 2d 65 64 20  ecently stat-ed 
0cd0: 66 69 6c 65 2e 0a 2a 2f 0a 69 36 34 20 66 69 6c  file..*/.i64 fil
0ce0: 65 5f 6d 74 69 6d 65 28 63 6f 6e 73 74 20 63 68  e_mtime(const ch
0cf0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
0d00: 20 20 72 65 74 75 72 6e 20 67 65 74 53 74 61 74    return getStat
0d10: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 20 3f  (zFilename, 0) ?
0d20: 20 2d 31 20 3a 20 66 69 6c 65 53 74 61 74 2e 73   -1 : fileStat.s
0d30: 74 5f 6d 74 69 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  t_mtime;.}../*.*
0d40: 2a 20 53 61 6d 65 20 61 73 20 66 69 6c 65 5f 6d  * Same as file_m
0d50: 74 69 6d 65 28 29 2c 20 62 75 74 20 74 61 6b 65  time(), but take
0d60: 73 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 73  s into account s
0d70: 79 6d 6c 69 6e 6b 73 2e 0a 2a 2f 0a 69 36 34 20  ymlinks..*/.i64 
0d80: 66 69 6c 65 5f 77 64 5f 6d 74 69 6d 65 28 63 6f  file_wd_mtime(co
0d90: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
0da0: 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  ame){.  return g
0db0: 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65  etStat(zFilename
0dc0: 2c 20 31 29 20 3f 20 2d 31 20 3a 20 66 69 6c 65  , 1) ? -1 : file
0dd0: 53 74 61 74 2e 73 74 5f 6d 74 69 6d 65 3b 0a 7d  Stat.st_mtime;.}
0de0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
0df0: 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
0e00: 20 66 69 6c 65 20 69 73 20 61 6e 20 6f 72 64 69   file is an ordi
0e10: 6e 61 72 79 20 66 69 6c 65 20 6f 72 20 73 79 6d  nary file or sym
0e20: 6c 69 6e 6b 0a 2a 2a 20 61 6e 64 20 73 79 6d 6c  link.** and syml
0e30: 69 6e 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  inks are allowed
0e40: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
0e50: 65 20 66 6f 72 20 64 69 72 65 63 74 6f 72 69 65  e for directorie
0e60: 73 2c 20 64 65 76 69 63 65 73 2c 20 66 69 66 6f  s, devices, fifo
0e70: 73 2c 20 65 74 63 2e 0a 2a 2f 0a 69 6e 74 20 66  s, etc..*/.int f
0e80: 69 6c 65 5f 77 64 5f 69 73 66 69 6c 65 5f 6f 72  ile_wd_isfile_or
0e90: 5f 6c 69 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72  _link(const char
0ea0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
0eb0: 72 65 74 75 72 6e 20 67 65 74 53 74 61 74 28 7a  return getStat(z
0ec0: 46 69 6c 65 6e 61 6d 65 2c 20 31 29 20 3f 20 30  Filename, 1) ? 0
0ed0: 20 3a 20 53 5f 49 53 52 45 47 28 66 69 6c 65 53   : S_ISREG(fileS
0ee0: 74 61 74 2e 73 74 5f 6d 6f 64 65 29 20 7c 7c 0a  tat.st_mode) ||.
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 20 20 20 20 53 5f 49 53 4c 4e 4b 28 66 69 6c       S_ISLNK(fil
0f20: 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 3b 0a  eStat.st_mode);.
0f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0f40: 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65  TRUE if the name
0f50: 64 20 66 69 6c 65 20 69 73 20 61 6e 20 6f 72 64  d file is an ord
0f60: 69 6e 61 72 79 20 66 69 6c 65 2e 20 20 52 65 74  inary file.  Ret
0f70: 75 72 6e 20 66 61 6c 73 65 0a 2a 2a 20 66 6f 72  urn false.** for
0f80: 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 64 65   directories, de
0f90: 76 69 63 65 73 2c 20 66 69 66 6f 73 2c 20 73 79  vices, fifos, sy
0fa0: 6d 6c 69 6e 6b 73 2c 20 65 74 63 2e 0a 2a 2f 0a  mlinks, etc..*/.
0fb0: 69 6e 74 20 66 69 6c 65 5f 69 73 66 69 6c 65 28  int file_isfile(
0fc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
0fd0: 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e  ename){.  return
0fe0: 20 67 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61   getStat(zFilena
0ff0: 6d 65 2c 20 30 29 20 3f 20 30 20 3a 20 53 5f 49  me, 0) ? 0 : S_I
1000: 53 52 45 47 28 66 69 6c 65 53 74 61 74 2e 73 74  SREG(fileStat.st
1010: 5f 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _mode);.}../*.**
1020: 20 53 61 6d 65 20 61 73 20 66 69 6c 65 5f 69 73   Same as file_is
1030: 66 69 6c 65 28 29 2c 20 62 75 74 20 74 61 6b 65  file(), but take
1040: 73 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 73  s into account s
1050: 79 6d 6c 69 6e 6b 73 2e 0a 2a 2f 0a 69 6e 74 20  ymlinks..*/.int 
1060: 66 69 6c 65 5f 77 64 5f 69 73 66 69 6c 65 28 63  file_wd_isfile(c
1070: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1080: 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  name){.  return 
1090: 67 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d  getStat(zFilenam
10a0: 65 2c 20 31 29 20 3f 20 30 20 3a 20 53 5f 49 53  e, 1) ? 0 : S_IS
10b0: 52 45 47 28 66 69 6c 65 53 74 61 74 2e 73 74 5f  REG(fileStat.st_
10c0: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mode);.}../*.** 
10d0: 43 72 65 61 74 65 20 73 79 6d 6c 69 6e 6b 20 74  Create symlink t
10e0: 6f 20 66 69 6c 65 20 6f 6e 20 55 6e 69 78 2c 20  o file on Unix, 
10f0: 6f 72 20 70 6c 61 69 6e 2d 74 65 78 74 20 66 69  or plain-text fi
1100: 6c 65 20 77 69 74 68 0a 2a 2a 20 73 79 6d 6c 69  le with.** symli
1110: 6e 6b 20 74 61 72 67 65 74 20 69 66 20 22 61 6c  nk target if "al
1120: 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 22 20 69 73  low-symlinks" is
1130: 20 6f 66 66 20 6f 72 20 77 65 27 72 65 20 6f 6e   off or we're on
1140: 20 57 69 6e 64 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20   Windows..**.** 
1150: 41 72 67 75 6d 65 6e 74 73 3a 20 74 61 72 67 65  Arguments: targe
1160: 74 20 66 69 6c 65 20 28 73 79 6d 6c 69 6e 6b 20  t file (symlink 
1170: 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 69 74  will point to it
1180: 29 2c 20 6c 69 6e 6b 20 66 69 6c 65 0a 2a 2a 2f  ), link file.**/
1190: 0a 76 6f 69 64 20 73 79 6d 6c 69 6e 6b 5f 63 72  .void symlink_cr
11a0: 65 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20  eate(const char 
11b0: 2a 7a 54 61 72 67 65 74 46 69 6c 65 2c 20 63 6f  *zTargetFile, co
11c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 6b 46  nst char *zLinkF
11d0: 69 6c 65 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  ile){.#if !defin
11e0: 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 69 66 28  ed(_WIN32).  if(
11f0: 20 67 2e 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73   g.allowSymlinks
1200: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   ){.    int i, n
1210: 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
1220: 7a 4e 61 6d 65 2c 20 7a 42 75 66 5b 31 30 30 30  zName, zBuf[1000
1230: 5d 3b 0a 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20  ];..    nName = 
1240: 73 74 72 6c 65 6e 28 7a 4c 69 6e 6b 46 69 6c 65  strlen(zLinkFile
1250: 29 3b 0a 20 20 20 20 69 66 28 20 6e 4e 61 6d 65  );.    if( nName
1260: 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29  >=sizeof(zBuf) )
1270: 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
1280: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4c  mprintf("%s", zL
1290: 69 6e 6b 46 69 6c 65 29 3b 0a 20 20 20 20 7d 65  inkFile);.    }e
12a0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  lse{.      zName
12b0: 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 20 20 6d   = zBuf;.      m
12c0: 65 6d 63 70 79 28 7a 4e 61 6d 65 2c 20 7a 4c 69  emcpy(zName, zLi
12d0: 6e 6b 46 69 6c 65 2c 20 6e 4e 61 6d 65 2b 31 29  nkFile, nName+1)
12e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4e 61 6d  ;.    }.    nNam
12f0: 65 20 3d 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66  e = file_simplif
1300: 79 5f 6e 61 6d 65 28 7a 4e 61 6d 65 2c 20 6e 4e  y_name(zName, nN
1310: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  ame, 0);.    for
1320: 28 69 3d 31 3b 20 69 3c 6e 4e 61 6d 65 3b 20 69  (i=1; i<nName; i
1330: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
1340: 4e 61 6d 65 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Name[i]=='/' ){.
1350: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 69 5d          zName[i]
1360: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1370: 69 66 28 20 66 69 6c 65 5f 6d 6b 64 69 72 28 7a  if( file_mkdir(z
1380: 4e 61 6d 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  Name, 1) ){.    
1390: 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66          fossil_f
13a0: 61 74 61 6c 5f 72 65 63 75 72 73 69 76 65 28 22  atal_recursive("
13b0: 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  unable to create
13c0: 20 64 69 72 65 63 74 6f 72 79 20 25 73 22 2c 20   directory %s", 
13d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
13e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
13f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1400: 7a 4e 61 6d 65 5b 69 5d 20 3d 20 27 2f 27 3b 0a  zName[i] = '/';.
1410: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1420: 20 20 69 66 28 20 7a 4e 61 6d 65 21 3d 7a 42 75    if( zName!=zBu
1430: 66 20 29 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b  f ) free(zName);
1440: 0a 0a 20 20 20 20 69 66 28 20 73 79 6d 6c 69 6e  ..    if( symlin
1450: 6b 28 7a 54 61 72 67 65 74 46 69 6c 65 2c 20 7a  k(zTargetFile, z
1460: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
1470: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 5f 72    fossil_fatal_r
1480: 65 63 75 72 73 69 76 65 28 22 75 6e 61 62 6c 65  ecursive("unable
1490: 20 74 6f 20 63 72 65 61 74 65 20 73 79 6d 6c 69   to create symli
14a0: 6e 6b 20 5c 22 25 73 5c 22 22 2c 20 7a 4e 61 6d  nk \"%s\"", zNam
14b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
14c0: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
14d0: 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20   Blob content;. 
14e0: 20 20 20 62 6c 6f 62 5f 73 65 74 28 26 63 6f 6e     blob_set(&con
14f0: 74 65 6e 74 2c 20 7a 54 61 72 67 65 74 46 69 6c  tent, zTargetFil
1500: 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 77 72 69  e);.    blob_wri
1510: 74 65 5f 74 6f 5f 66 69 6c 65 28 26 63 6f 6e 74  te_to_file(&cont
1520: 65 6e 74 2c 20 7a 4c 69 6e 6b 46 69 6c 65 29 3b  ent, zLinkFile);
1530: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  .    blob_reset(
1540: 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 7d  &content);.  }.}
1550: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 73 79 6d  ../*.** Copy sym
1560: 62 6f 6c 69 63 20 6c 69 6e 6b 20 66 72 6f 6d 20  bolic link from 
1570: 7a 46 72 6f 6d 20 74 6f 20 7a 54 6f 2e 0a 2a 2f  zFrom to zTo..*/
1580: 0a 76 6f 69 64 20 73 79 6d 6c 69 6e 6b 5f 63 6f  .void symlink_co
1590: 70 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  py(const char *z
15a0: 46 72 6f 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  From, const char
15b0: 20 2a 7a 54 6f 29 7b 0a 20 20 42 6c 6f 62 20 63   *zTo){.  Blob c
15c0: 6f 6e 74 65 6e 74 3b 0a 20 20 62 6c 6f 62 5f 72  ontent;.  blob_r
15d0: 65 61 64 5f 6c 69 6e 6b 28 26 63 6f 6e 74 65 6e  ead_link(&conten
15e0: 74 2c 20 7a 46 72 6f 6d 29 3b 0a 20 20 73 79 6d  t, zFrom);.  sym
15f0: 6c 69 6e 6b 5f 63 72 65 61 74 65 28 62 6c 6f 62  link_create(blob
1600: 5f 73 74 72 28 26 63 6f 6e 74 65 6e 74 29 2c 20  _str(&content), 
1610: 7a 54 6f 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73  zTo);.  blob_res
1620: 65 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 7d 0a  et(&content);.}.
1630: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 66 69  ./*.** Return fi
1640: 6c 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 28  le permissions (
1650: 6e 6f 72 6d 61 6c 2c 20 65 78 65 63 75 74 61 62  normal, executab
1660: 6c 65 2c 20 6f 72 20 73 79 6d 6c 69 6e 6b 29 3a  le, or symlink):
1670: 0a 2a 2a 20 20 20 2d 20 50 45 52 4d 5f 45 58 45  .**   - PERM_EXE
1680: 20 69 66 20 66 69 6c 65 20 69 73 20 65 78 65 63   if file is exec
1690: 75 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 2d 20 50  utable;.**   - P
16a0: 45 52 4d 5f 4c 4e 4b 20 6f 6e 20 55 6e 69 78 20  ERM_LNK on Unix 
16b0: 69 66 20 66 69 6c 65 20 69 73 20 73 79 6d 6c 69  if file is symli
16c0: 6e 6b 20 61 6e 64 20 61 6c 6c 6f 77 2d 73 79 6d  nk and allow-sym
16d0: 6c 69 6e 6b 73 20 6f 70 74 69 6f 6e 20 69 73 20  links option is 
16e0: 6f 6e 3b 0a 2a 2a 20 20 20 2d 20 50 45 52 4d 5f  on;.**   - PERM_
16f0: 52 45 47 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65  REG for all othe
1700: 72 20 63 61 73 65 73 20 28 72 65 67 75 6c 61 72  r cases (regular
1710: 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79   file, directory
1720: 2c 20 66 69 66 6f 2c 20 65 74 63 29 2e 0a 2a 2f  , fifo, etc)..*/
1730: 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f 70 65 72  .int file_wd_per
1740: 6d 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  m(const char *zF
1750: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 66 28 20  ilename){.  if( 
1760: 67 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d  getStat(zFilenam
1770: 65 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20 50  e, 1) ) return P
1780: 45 52 4d 5f 52 45 47 3b 0a 23 69 66 20 64 65 66  ERM_REG;.#if def
1790: 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 23 20 20  ined(_WIN32).#  
17a0: 69 66 6e 64 65 66 20 53 5f 49 58 55 53 52 0a 23  ifndef S_IXUSR.#
17b0: 20 20 20 20 64 65 66 69 6e 65 20 53 5f 49 58 55      define S_IXU
17c0: 53 52 20 20 5f 53 5f 49 45 58 45 43 0a 23 20 20  SR  _S_IEXEC.#  
17d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 53 5f 49 53  endif.  if( S_IS
17e0: 52 45 47 28 66 69 6c 65 53 74 61 74 2e 73 74 5f  REG(fileStat.st_
17f0: 6d 6f 64 65 29 20 26 26 20 28 28 53 5f 49 58 55  mode) && ((S_IXU
1800: 53 52 29 26 66 69 6c 65 53 74 61 74 2e 73 74 5f  SR)&fileStat.st_
1810: 6d 6f 64 65 29 21 3d 30 20 29 0a 20 20 20 20 72  mode)!=0 ).    r
1820: 65 74 75 72 6e 20 50 45 52 4d 5f 45 58 45 3b 0a  eturn PERM_EXE;.
1830: 20 20 65 6c 73 65 0a 20 20 20 20 72 65 74 75 72    else.    retur
1840: 6e 20 50 45 52 4d 5f 52 45 47 3b 0a 23 65 6c 73  n PERM_REG;.#els
1850: 65 0a 20 20 69 66 28 20 53 5f 49 53 52 45 47 28  e.  if( S_ISREG(
1860: 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65  fileStat.st_mode
1870: 29 20 26 26 0a 20 20 20 20 20 20 28 28 53 5f 49  ) &&.      ((S_I
1880: 58 55 53 52 7c 53 5f 49 58 47 52 50 7c 53 5f 49  XUSR|S_IXGRP|S_I
1890: 58 4f 54 48 29 26 66 69 6c 65 53 74 61 74 2e 73  XOTH)&fileStat.s
18a0: 74 5f 6d 6f 64 65 29 21 3d 30 20 29 0a 20 20 20  t_mode)!=0 ).   
18b0: 20 72 65 74 75 72 6e 20 50 45 52 4d 5f 45 58 45   return PERM_EXE
18c0: 3b 0a 20 20 65 6c 73 65 20 69 66 28 20 67 2e 61  ;.  else if( g.a
18d0: 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73 20 26 26 20  llowSymlinks && 
18e0: 53 5f 49 53 4c 4e 4b 28 66 69 6c 65 53 74 61 74  S_ISLNK(fileStat
18f0: 2e 73 74 5f 6d 6f 64 65 29 20 29 0a 20 20 20 20  .st_mode) ).    
1900: 72 65 74 75 72 6e 20 50 45 52 4d 5f 4c 4e 4b 3b  return PERM_LNK;
1910: 0a 20 20 65 6c 73 65 0a 20 20 20 20 72 65 74 75  .  else.    retu
1920: 72 6e 20 50 45 52 4d 5f 52 45 47 3b 0a 23 65 6e  rn PERM_REG;.#en
1930: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
1940: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1950: 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 61 6e  named file is an
1960: 20 65 78 65 63 75 74 61 62 6c 65 2e 20 20 52 65   executable.  Re
1970: 74 75 72 6e 20 66 61 6c 73 65 0a 2a 2a 20 66 6f  turn false.** fo
1980: 72 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 64  r directories, d
1990: 65 76 69 63 65 73 2c 20 66 69 66 6f 73 2c 20 73  evices, fifos, s
19a0: 79 6d 6c 69 6e 6b 73 2c 20 65 74 63 2e 0a 2a 2f  ymlinks, etc..*/
19b0: 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f 69 73 65  .int file_wd_ise
19c0: 78 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  xe(const char *z
19d0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74  Filename){.  ret
19e0: 75 72 6e 20 66 69 6c 65 5f 77 64 5f 70 65 72 6d  urn file_wd_perm
19f0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 50 45 52  (zFilename)==PER
1a00: 4d 5f 45 58 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  M_EXE;.}../*.** 
1a10: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1a20: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73  he named file is
1a30: 20 61 20 73 79 6d 6c 69 6e 6b 20 61 6e 64 20 73   a symlink and s
1a40: 79 6d 6c 69 6e 6b 73 20 61 72 65 20 61 6c 6c 6f  ymlinks are allo
1a50: 77 65 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  wed..** Return f
1a60: 61 6c 73 65 20 66 6f 72 20 61 6c 6c 20 6f 74 68  alse for all oth
1a70: 65 72 20 63 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  er cases..**.** 
1a80: 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c 77 61  On Windows, alwa
1a90: 79 73 20 72 65 74 75 72 6e 20 46 61 6c 73 65 2e  ys return False.
1aa0: 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f  .*/.int file_wd_
1ab0: 69 73 6c 69 6e 6b 28 63 6f 6e 73 74 20 63 68 61  islink(const cha
1ac0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
1ad0: 20 72 65 74 75 72 6e 20 66 69 6c 65 5f 77 64 5f   return file_wd_
1ae0: 70 65 72 6d 28 7a 46 69 6c 65 6e 61 6d 65 29 3d  perm(zFilename)=
1af0: 3d 50 45 52 4d 5f 4c 4e 4b 3b 0a 7d 0a 0a 2f 2a  =PERM_LNK;.}../*
1b00: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
1b10: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 64  zFilename is a d
1b20: 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72  irectory.  Retur
1b30: 6e 20 30 20 69 66 20 7a 46 69 6c 65 6e 61 6d 65  n 0 if zFilename
1b40: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
1b50: 73 74 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66  st.  Return 2 if
1b60: 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
1b70: 73 20 62 75 74 20 69 73 20 73 6f 6d 65 74 68 69  s but is somethi
1b80: 6e 67 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  ng.** other than
1b90: 20 61 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f   a directory..*/
1ba0: 0a 69 6e 74 20 66 69 6c 65 5f 69 73 64 69 72 28  .int file_isdir(
1bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1bc0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63  ename){.  int rc
1bd0: 3b 0a 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ;..  if( zFilena
1be0: 6d 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  me ){.    char *
1bf0: 7a 46 4e 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  zFN = mprintf("%
1c00: 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
1c10: 20 20 20 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66      file_simplif
1c20: 79 5f 6e 61 6d 65 28 7a 46 4e 2c 20 2d 31 2c 20  y_name(zFN, -1, 
1c30: 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  0);.    rc = get
1c40: 53 74 61 74 28 7a 46 4e 2c 20 30 29 3b 0a 20 20  Stat(zFN, 0);.  
1c50: 20 20 66 72 65 65 28 7a 46 4e 29 3b 0a 20 20 7d    free(zFN);.  }
1c60: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67  else{.    rc = g
1c70: 65 74 53 74 61 74 28 30 2c 20 30 29 3b 0a 20 20  etStat(0, 0);.  
1c80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  }.  return rc ? 
1c90: 30 20 3a 20 28 53 5f 49 53 44 49 52 28 66 69 6c  0 : (S_ISDIR(fil
1ca0: 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 20 3f  eStat.st_mode) ?
1cb0: 20 31 20 3a 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   1 : 2);.}../*.*
1cc0: 2a 20 53 61 6d 65 20 61 73 20 66 69 6c 65 5f 69  * Same as file_i
1cd0: 73 64 69 72 28 29 2c 20 62 75 74 20 74 61 6b 65  sdir(), but take
1ce0: 73 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 73  s into account s
1cf0: 79 6d 6c 69 6e 6b 73 2e 0a 2a 2f 0a 69 6e 74 20  ymlinks..*/.int 
1d00: 66 69 6c 65 5f 77 64 5f 69 73 64 69 72 28 63 6f  file_wd_isdir(co
1d10: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1d20: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ame){.  int rc;.
1d30: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1d40: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   ){.    char *zF
1d50: 4e 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22  N = mprintf("%s"
1d60: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1d70: 20 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66 79 5f    file_simplify_
1d80: 6e 61 6d 65 28 7a 46 4e 2c 20 2d 31 2c 20 30 29  name(zFN, -1, 0)
1d90: 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 53 74  ;.    rc = getSt
1da0: 61 74 28 7a 46 4e 2c 20 31 29 3b 0a 20 20 20 20  at(zFN, 1);.    
1db0: 66 72 65 65 28 7a 46 4e 29 3b 0a 20 20 7d 65 6c  free(zFN);.  }el
1dc0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
1dd0: 53 74 61 74 28 30 2c 20 31 29 3b 0a 20 20 7d 0a  Stat(0, 1);.  }.
1de0: 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 30 20    return rc ? 0 
1df0: 3a 20 28 53 5f 49 53 44 49 52 28 66 69 6c 65 53  : (S_ISDIR(fileS
1e00: 74 61 74 2e 73 74 5f 6d 6f 64 65 29 20 3f 20 31  tat.st_mode) ? 1
1e10: 20 3a 20 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   : 2);.}.../*.**
1e20: 20 57 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   Wrapper around 
1e30: 74 68 65 20 61 63 63 65 73 73 28 29 20 73 79 73  the access() sys
1e40: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74  tem call..*/.int
1e50: 20 66 69 6c 65 5f 61 63 63 65 73 73 28 63 6f 6e   file_access(con
1e60: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1e70: 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  me, int flags){.
1e80: 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20  #ifdef _WIN32.  
1e90: 77 63 68 61 72 5f 74 20 2a 7a 4d 62 63 73 20 3d  wchar_t *zMbcs =
1ea0: 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f   fossil_utf8_to_
1eb0: 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  unicode(zFilenam
1ec0: 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 5f  e);.  int rc = _
1ed0: 77 61 63 63 65 73 73 28 7a 4d 62 63 73 2c 20 66  waccess(zMbcs, f
1ee0: 6c 61 67 73 29 3b 0a 20 20 66 6f 73 73 69 6c 5f  lags);.  fossil_
1ef0: 6d 62 63 73 5f 66 72 65 65 28 7a 4d 62 63 73 29  mbcs_free(zMbcs)
1f00: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
1f10: 20 3d 20 61 63 63 65 73 73 28 7a 46 69 6c 65 6e   = access(zFilen
1f20: 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 23 65 6e  ame, flags);.#en
1f30: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
1f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
1f50: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 6e 61 6d  n unused filenam
1f60: 65 20 73 69 6d 69 6c 61 72 20 74 6f 20 7a 42 61  e similar to zBa
1f70: 73 65 20 77 69 74 68 20 7a 53 75 66 66 69 78 20  se with zSuffix 
1f80: 61 70 70 65 6e 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  appended..**.** 
1f90: 4d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 72 65  Make the name re
1fa0: 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 77 6f  lative to the wo
1fb0: 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
1fc0: 69 66 20 72 65 6c 46 6c 61 67 20 69 73 20 74 72  if relFlag is tr
1fd0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ue..**.** Space 
1fe0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  to hold the new 
1ff0: 66 69 6c 65 6e 61 6d 65 20 69 73 20 6f 62 74 61  filename is obta
2000: 69 6e 65 64 20 66 6f 72 6d 20 6d 70 72 69 6e 74  ined form mprint
2010: 66 28 29 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  f() and should.*
2020: 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  * be freed by th
2030: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63 68 61  e caller..*/.cha
2040: 72 20 2a 66 69 6c 65 5f 6e 65 77 6e 61 6d 65 28  r *file_newname(
2050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
2060: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
2070: 53 75 66 66 69 78 2c 20 69 6e 74 20 72 65 6c 46  Suffix, int relF
2080: 6c 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20  lag){.  char *z 
2090: 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  = 0;.  int cnt =
20a0: 20 30 3b 0a 20 20 7a 20 3d 20 6d 70 72 69 6e 74   0;.  z = mprint
20b0: 66 28 22 25 73 2d 25 73 22 2c 20 7a 42 61 73 65  f("%s-%s", zBase
20c0: 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 77 68  , zSuffix);.  wh
20d0: 69 6c 65 28 20 66 69 6c 65 5f 73 69 7a 65 28 7a  ile( file_size(z
20e0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73  )>=0 ){.    foss
20f0: 69 6c 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  il_free(z);.    
2100: 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2d  z = mprintf("%s-
2110: 25 73 2d 25 64 22 2c 20 7a 42 61 73 65 2c 20 7a  %s-%d", zBase, z
2120: 53 75 66 66 69 78 2c 20 63 6e 74 2b 2b 29 3b 0a  Suffix, cnt++);.
2130: 20 20 7d 0a 20 20 69 66 28 20 72 65 6c 46 6c 61    }.  if( relFla
2140: 67 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 78 3b  g ){.    Blob x;
2150: 0a 20 20 20 20 66 69 6c 65 5f 72 65 6c 61 74 69  .    file_relati
2160: 76 65 5f 6e 61 6d 65 28 7a 2c 20 26 78 2c 20 30  ve_name(z, &x, 0
2170: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72  );.    fossil_fr
2180: 65 65 28 7a 29 3b 0a 20 20 20 20 7a 20 3d 20 62  ee(z);.    z = b
2190: 6c 6f 62 5f 73 74 72 28 26 78 29 3b 0a 20 20 7d  lob_str(&x);.  }
21a0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
21b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21c0: 20 74 61 69 6c 20 6f 66 20 61 20 66 69 6c 65 20   tail of a file 
21d0: 70 61 74 68 6e 61 6d 65 2e 20 20 54 68 65 20 74  pathname.  The t
21e0: 61 69 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  ail is the last 
21f0: 63 6f 6d 70 6f 6e 65 6e 74 0a 2a 2a 20 6f 66 20  component.** of 
2200: 74 68 65 20 70 61 74 68 2e 20 20 46 6f 72 20 65  the path.  For e
2210: 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 61 69 6c  xample, the tail
2220: 20 6f 66 20 22 2f 61 2f 62 2f 63 2e 64 22 20 69   of "/a/b/c.d" i
2230: 73 20 22 63 2e 64 22 2e 0a 2a 2f 0a 63 6f 6e 73  s "c.d"..*/.cons
2240: 74 20 63 68 61 72 20 2a 66 69 6c 65 5f 74 61 69  t char *file_tai
2250: 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  l(const char *z)
2260: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2270: 7a 54 61 69 6c 20 3d 20 7a 3b 0a 20 20 77 68 69  zTail = z;.  whi
2280: 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  le( z[0] ){.    
2290: 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 29 20  if( z[0]=='/' ) 
22a0: 7a 54 61 69 6c 20 3d 20 26 7a 5b 31 5d 3b 0a 20  zTail = &z[1];. 
22b0: 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     z++;.  }.  re
22c0: 74 75 72 6e 20 7a 54 61 69 6c 3b 0a 7d 0a 0a 2f  turn zTail;.}../
22d0: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f  *.** Copy the co
22e0: 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 6c 65 20  ntent of a file 
22f0: 66 72 6f 6d 20 6f 6e 65 20 70 6c 61 63 65 20 74  from one place t
2300: 6f 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 76 6f  o another..*/.vo
2310: 69 64 20 66 69 6c 65 5f 63 6f 70 79 28 63 6f 6e  id file_copy(con
2320: 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 2c 20  st char *zFrom, 
2330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 29  const char *zTo)
2340: 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 2c 20 2a 6f  {.  FILE *in, *o
2350: 75 74 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  ut;.  int got;. 
2360: 20 63 68 61 72 20 7a 42 75 66 5b 38 31 39 32 5d   char zBuf[8192]
2370: 3b 0a 20 20 69 6e 20 3d 20 66 6f 73 73 69 6c 5f  ;.  in = fossil_
2380: 66 6f 70 65 6e 28 7a 46 72 6f 6d 2c 20 22 72 62  fopen(zFrom, "rb
2390: 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
23a0: 29 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22  ) fossil_fatal("
23b0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
23c0: 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c  \" for reading",
23d0: 20 7a 46 72 6f 6d 29 3b 0a 20 20 6f 75 74 20 3d   zFrom);.  out =
23e0: 20 66 6f 73 73 69 6c 5f 66 6f 70 65 6e 28 7a 54   fossil_fopen(zT
23f0: 6f 2c 20 22 77 62 22 29 3b 0a 20 20 69 66 28 20  o, "wb");.  if( 
2400: 6f 75 74 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f  out==0 ) fossil_
2410: 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74 20 6f 70  fatal("cannot op
2420: 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72  en \"%s\" for wr
2430: 69 74 69 6e 67 22 2c 20 7a 54 6f 29 3b 0a 20 20  iting", zTo);.  
2440: 77 68 69 6c 65 28 20 28 67 6f 74 3d 66 72 65 61  while( (got=frea
2450: 64 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f  d(zBuf, 1, sizeo
2460: 66 28 7a 42 75 66 29 2c 20 69 6e 29 29 3e 30 20  f(zBuf), in))>0 
2470: 29 7b 0a 20 20 20 20 66 77 72 69 74 65 28 7a 42  ){.    fwrite(zB
2480: 75 66 2c 20 31 2c 20 67 6f 74 2c 20 6f 75 74 29  uf, 1, got, out)
2490: 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  ;.  }.  fclose(i
24a0: 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74  n);.  fclose(out
24b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
24c0: 6f 72 20 63 6c 65 61 72 20 74 68 65 20 65 78 65  or clear the exe
24d0: 63 75 74 65 20 62 69 74 20 6f 6e 20 61 20 66 69  cute bit on a fi
24e0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  le.  Return true
24f0: 20 69 66 20 61 20 63 68 61 6e 67 65 0a 2a 2a 20   if a change.** 
2500: 6f 63 63 75 72 72 65 64 20 61 6e 64 20 66 61 6c  occurred and fal
2510: 73 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  se if this routi
2520: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
2530: 2f 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f 73 65  /.int file_wd_se
2540: 74 65 78 65 28 63 6f 6e 73 74 20 63 68 61 72 20  texe(const char 
2550: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
2560: 6f 6e 6f 66 66 29 7b 0a 20 20 69 6e 74 20 72 63  onoff){.  int rc
2570: 20 3d 20 30 3b 0a 23 69 66 20 21 64 65 66 69 6e   = 0;.#if !defin
2580: 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 73 74 72  ed(_WIN32).  str
2590: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
25a0: 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 61 74 28  if( fossil_stat(
25b0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 62 75 66 2c  zFilename, &buf,
25c0: 20 31 29 21 3d 30 20 7c 7c 20 53 5f 49 53 4c 4e   1)!=0 || S_ISLN
25d0: 4b 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  K(buf.st_mode) )
25e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
25f0: 20 6f 6e 6f 66 66 20 29 7b 0a 20 20 20 20 69 6e   onoff ){.    in
2600: 74 20 74 61 72 67 65 74 4d 6f 64 65 20 3d 20 28  t targetMode = (
2610: 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20 30 34  buf.st_mode & 04
2620: 34 34 29 3e 3e 32 3b 0a 20 20 20 20 69 66 28 20  44)>>2;.    if( 
2630: 28 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20 30  (buf.st_mode & 0
2640: 31 31 31 29 21 3d 74 61 72 67 65 74 4d 6f 64 65  111)!=targetMode
2650: 20 29 7b 0a 20 20 20 20 20 20 63 68 6d 6f 64 28   ){.      chmod(
2660: 7a 46 69 6c 65 6e 61 6d 65 2c 20 62 75 66 2e 73  zFilename, buf.s
2670: 74 5f 6d 6f 64 65 20 7c 20 74 61 72 67 65 74 4d  t_mode | targetM
2680: 6f 64 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ode);.      rc =
2690: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
26a0: 65 7b 0a 20 20 20 20 69 66 28 20 28 62 75 66 2e  e{.    if( (buf.
26b0: 73 74 5f 6d 6f 64 65 20 26 20 30 31 31 31 29 21  st_mode & 0111)!
26c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 6d 6f  =0 ){.      chmo
26d0: 64 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 62 75 66  d(zFilename, buf
26e0: 2e 73 74 5f 6d 6f 64 65 20 26 20 7e 30 31 31 31  .st_mode & ~0111
26f0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2710: 66 20 2f 2a 20 5f 57 49 4e 33 32 20 2a 2f 0a 20  f /* _WIN32 */. 
2720: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2730: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 74 69  *.** Set the mti
2740: 6d 65 20 66 6f 72 20 61 20 66 69 6c 65 2e 0a 2a  me for a file..*
2750: 2f 0a 76 6f 69 64 20 66 69 6c 65 5f 73 65 74 5f  /.void file_set_
2760: 6d 74 69 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  mtime(const char
2770: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 36 34   *zFilename, i64
2780: 20 6e 65 77 4d 54 69 6d 65 29 7b 0a 23 69 66 20   newMTime){.#if 
2790: 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  !defined(_WIN32)
27a0: 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
27b0: 6c 20 74 76 5b 32 5d 3b 0a 20 20 6d 65 6d 73 65  l tv[2];.  memse
27c0: 74 28 74 76 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(tv, 0, sizeof(
27d0: 74 76 5b 30 5d 29 2a 32 29 3b 0a 20 20 74 76 5b  tv[0])*2);.  tv[
27e0: 30 5d 2e 74 76 5f 73 65 63 20 3d 20 6e 65 77 4d  0].tv_sec = newM
27f0: 54 69 6d 65 3b 0a 20 20 74 76 5b 31 5d 2e 74 76  Time;.  tv[1].tv
2800: 5f 73 65 63 20 3d 20 6e 65 77 4d 54 69 6d 65 3b  _sec = newMTime;
2810: 0a 20 20 75 74 69 6d 65 73 28 7a 46 69 6c 65 6e  .  utimes(zFilen
2820: 61 6d 65 2c 20 74 76 29 3b 0a 23 65 6c 73 65 0a  ame, tv);.#else.
2830: 20 20 73 74 72 75 63 74 20 5f 75 74 69 6d 62 75    struct _utimbu
2840: 66 20 74 62 3b 0a 20 20 77 63 68 61 72 5f 74 20  f tb;.  wchar_t 
2850: 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c 5f  *zMbcs = fossil_
2860: 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28  utf8_to_unicode(
2870: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 74 62  zFilename);.  tb
2880: 2e 61 63 74 69 6d 65 20 3d 20 6e 65 77 4d 54 69  .actime = newMTi
2890: 6d 65 3b 0a 20 20 74 62 2e 6d 6f 64 74 69 6d 65  me;.  tb.modtime
28a0: 20 3d 20 6e 65 77 4d 54 69 6d 65 3b 0a 20 20 5f   = newMTime;.  _
28b0: 77 75 74 69 6d 65 28 7a 4d 62 63 73 2c 20 26 74  wutime(zMbcs, &t
28c0: 62 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 6d 62 63  b);.  fossil_mbc
28d0: 73 5f 66 72 65 65 28 7a 4d 62 63 73 29 3b 0a 23  s_free(zMbcs);.#
28e0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
28f0: 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 73 65 74  OMMAND: test-set
2900: 2d 6d 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 55 73 61  -mtime.**.** Usa
2910: 67 65 3a 20 25 66 6f 73 73 69 6c 20 74 65 73 74  ge: %fossil test
2920: 2d 73 65 74 2d 6d 74 69 6d 65 20 46 49 4c 45 4e  -set-mtime FILEN
2930: 41 4d 45 20 44 41 54 45 2f 54 49 4d 45 0a 2a 2a  AME DATE/TIME.**
2940: 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 6d 74 69  .** Sets the mti
2950: 6d 65 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  me of the named 
2960: 66 69 6c 65 20 74 6f 20 74 68 65 20 64 61 74 65  file to the date
2970: 2f 74 69 6d 65 20 73 68 6f 77 6e 2e 0a 2a 2f 0a  /time shown..*/.
2980: 76 6f 69 64 20 74 65 73 74 5f 73 65 74 5f 6d 74  void test_set_mt
2990: 69 6d 65 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e  ime(void){.  con
29a0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
29b0: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20    char *zDate;. 
29c0: 20 69 36 34 20 69 4d 54 69 6d 65 3b 0a 20 20 69   i64 iMTime;.  i
29d0: 66 28 20 67 2e 61 72 67 63 21 3d 34 20 29 7b 0a  f( g.argc!=4 ){.
29e0: 20 20 20 20 75 73 61 67 65 28 22 74 65 73 74 2d      usage("test-
29f0: 73 65 74 2d 6d 74 69 6d 65 20 46 49 4c 45 4e 41  set-mtime FILENA
2a00: 4d 45 20 44 41 54 45 2f 54 49 4d 45 22 29 3b 0a  ME DATE/TIME");.
2a10: 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f 72    }.  db_open_or
2a20: 5f 61 74 74 61 63 68 28 22 3a 6d 65 6d 6f 72 79  _attach(":memory
2a30: 3a 22 2c 20 22 6d 65 6d 22 29 3b 0a 20 20 69 4d  :", "mem");.  iM
2a40: 54 69 6d 65 20 3d 20 64 62 5f 69 6e 74 36 34 28  Time = db_int64(
2a50: 30 2c 20 22 53 45 4c 45 43 54 20 73 74 72 66 74  0, "SELECT strft
2a60: 69 6d 65 28 27 25 25 73 27 2c 25 51 29 22 2c 20  ime('%%s',%Q)", 
2a70: 67 2e 61 72 67 76 5b 33 5d 29 3b 0a 20 20 7a 46  g.argv[3]);.  zF
2a80: 69 6c 65 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b  ile = g.argv[2];
2a90: 0a 20 20 66 69 6c 65 5f 73 65 74 5f 6d 74 69 6d  .  file_set_mtim
2aa0: 65 28 7a 46 69 6c 65 2c 20 69 4d 54 69 6d 65 29  e(zFile, iMTime)
2ab0: 3b 0a 20 20 69 4d 54 69 6d 65 20 3d 20 66 69 6c  ;.  iMTime = fil
2ac0: 65 5f 77 64 5f 6d 74 69 6d 65 28 7a 46 69 6c 65  e_wd_mtime(zFile
2ad0: 29 3b 0a 20 20 7a 44 61 74 65 20 3d 20 64 62 5f  );.  zDate = db_
2ae0: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
2af0: 64 61 74 65 74 69 6d 65 28 25 6c 6c 64 2c 20 27  datetime(%lld, '
2b00: 75 6e 69 78 65 70 6f 63 68 27 29 22 2c 20 69 4d  unixepoch')", iM
2b10: 54 69 6d 65 29 3b 0a 20 20 66 6f 73 73 69 6c 5f  Time);.  fossil_
2b20: 70 72 69 6e 74 28 22 53 65 74 20 6d 74 69 6d 65  print("Set mtime
2b30: 20 6f 66 20 5c 22 25 73 5c 22 20 74 6f 20 25 73   of \"%s\" to %s
2b40: 20 28 25 6c 6c 64 29 5c 6e 22 2c 20 7a 46 69 6c   (%lld)\n", zFil
2b50: 65 2c 20 7a 44 61 74 65 2c 20 69 4d 54 69 6d 65  e, zDate, iMTime
2b60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
2b70: 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  te a file..*/.vo
2b80: 69 64 20 66 69 6c 65 5f 64 65 6c 65 74 65 28 63  id file_delete(c
2b90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2ba0: 6e 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 5f 57  name){.#ifdef _W
2bb0: 49 4e 33 32 0a 20 20 77 63 68 61 72 5f 74 20 2a  IN32.  wchar_t *
2bc0: 7a 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f  z = fossil_utf8_
2bd0: 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65  to_unicode(zFile
2be0: 6e 61 6d 65 29 3b 0a 20 20 5f 77 75 6e 6c 69 6e  name);.  _wunlin
2bf0: 6b 28 7a 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 6d  k(z);.  fossil_m
2c00: 62 63 73 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c  bcs_free(z);.#el
2c10: 73 65 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  se.  unlink(zFil
2c20: 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 7d  ename);.#endif.}
2c30: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
2c40: 68 65 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  he directory nam
2c50: 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ed in the argume
2c60: 6e 74 2c 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nt, if it does n
2c70: 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 78  ot already.** ex
2c80: 69 73 74 2e 20 20 49 66 20 66 6f 72 63 65 46 6c  ist.  If forceFl
2c90: 61 67 20 69 73 20 31 2c 20 64 65 6c 65 74 65 20  ag is 1, delete 
2ca0: 61 6e 79 20 70 72 69 6f 72 20 6e 6f 6e 2d 64 69  any prior non-di
2cb0: 72 65 63 74 6f 72 79 20 6f 62 6a 65 63 74 0a 2a  rectory object.*
2cc0: 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
2cd0: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  name..**.** Retu
2ce0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2cf0: 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
2d00: 66 69 6c 65 5f 6d 6b 64 69 72 28 63 6f 6e 73 74  file_mkdir(const
2d10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
2d20: 74 20 66 6f 72 63 65 46 6c 61 67 29 7b 0a 20 20  t forceFlag){.  
2d30: 69 6e 74 20 72 63 20 3d 20 66 69 6c 65 5f 77 64  int rc = file_wd
2d40: 5f 69 73 64 69 72 28 7a 4e 61 6d 65 29 3b 0a 20  _isdir(zName);. 
2d50: 20 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20 20   if( rc==2 ){.  
2d60: 20 20 69 66 28 20 21 66 6f 72 63 65 46 6c 61 67    if( !forceFlag
2d70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2d80: 20 66 69 6c 65 5f 64 65 6c 65 74 65 28 7a 4e 61   file_delete(zNa
2d90: 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  me);.  }.  if( r
2da0: 63 21 3d 31 20 29 7b 0a 23 69 66 20 64 65 66 69  c!=1 ){.#if defi
2db0: 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20  ned(_WIN32).    
2dc0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 77 63 68 61  int rc;.    wcha
2dd0: 72 5f 74 20 2a 7a 4d 62 63 73 20 3d 20 66 6f 73  r_t *zMbcs = fos
2de0: 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  sil_utf8_to_unic
2df0: 6f 64 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ode(zName);.    
2e00: 72 63 20 3d 20 5f 77 6d 6b 64 69 72 28 7a 4d 62  rc = _wmkdir(zMb
2e10: 63 73 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  cs);.    fossil_
2e20: 6d 62 63 73 5f 66 72 65 65 28 7a 4d 62 63 73 29  mbcs_free(zMbcs)
2e30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2e40: 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 74 75 72  .#else.    retur
2e50: 6e 20 6d 6b 64 69 72 28 7a 4e 61 6d 65 2c 20 30  n mkdir(zName, 0
2e60: 37 35 35 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  755);.#endif.  }
2e70: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2e80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2e90: 65 20 69 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  e if the filenam
2ea0: 65 20 67 69 76 65 6e 20 69 73 20 61 20 76 61 6c  e given is a val
2eb0: 69 64 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 0a  id filename for.
2ec0: 2a 2a 20 61 20 66 69 6c 65 20 69 6e 20 61 20 72  ** a file in a r
2ed0: 65 70 6f 73 69 74 6f 72 79 2e 20 20 56 61 6c 69  epository.  Vali
2ee0: 64 20 66 69 6c 65 6e 61 6d 65 73 20 66 6f 6c 6c  d filenames foll
2ef0: 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  ow all of the.**
2f00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73   following rules
2f10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 44  :.**.**     *  D
2f20: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
2f30: 74 68 20 22 2f 22 0a 2a 2a 20 20 20 20 20 2a 20  th "/".**     * 
2f40: 20 44 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   Does not contai
2f50: 6e 20 61 6e 79 20 70 61 74 68 20 65 6c 65 6d 65  n any path eleme
2f60: 6e 74 20 6e 61 6d 65 64 20 22 2e 22 20 6f 72 20  nt named "." or 
2f70: 22 2e 2e 22 0a 2a 2a 20 20 20 20 20 2a 20 20 44  "..".**     *  D
2f80: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
2f90: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 63 68 61  any of these cha
2fa0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 70  racters in the p
2fb0: 61 74 68 3a 20 22 5c 3a 22 0a 2a 2a 20 20 20 20  ath: "\:".**    
2fc0: 20 2a 20 20 44 6f 65 73 20 6e 6f 74 20 65 6e 64   *  Does not end
2fd0: 20 77 69 74 68 20 22 2f 22 2e 0a 2a 2a 20 20 20   with "/"..**   
2fe0: 20 20 2a 20 20 44 6f 65 73 20 6e 6f 74 20 63 6f    *  Does not co
2ff0: 6e 74 61 69 6e 20 74 77 6f 20 6f 72 20 6d 6f 72  ntain two or mor
3000: 65 20 22 2f 22 20 63 68 61 72 61 63 74 65 72 73  e "/" characters
3010: 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a 20 20 20   in a row..**   
3020: 20 20 2a 20 20 43 6f 6e 74 61 69 6e 73 20 61 74    *  Contains at
3030: 20 6c 65 61 73 74 20 6f 6e 65 20 63 68 61 72 61   least one chara
3040: 63 74 65 72 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65  cter.*/.int file
3050: 5f 69 73 5f 73 69 6d 70 6c 65 5f 70 61 74 68 6e  _is_simple_pathn
3060: 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ame(const char *
3070: 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  z){.  int i;.  c
3080: 68 61 72 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20  har c = z[0];.  
3090: 69 66 28 20 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d  if( c=='/' || c=
30a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
30b0: 20 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0a 20   if( c=='.' ){. 
30c0: 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27     if( z[1]=='/'
30d0: 20 7c 7c 20 7a 5b 31 5d 3d 3d 30 20 29 20 72 65   || z[1]==0 ) re
30e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
30f0: 7a 5b 31 5d 3d 3d 27 2e 27 20 26 26 20 28 7a 5b  z[1]=='.' && (z[
3100: 32 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 32 5d 3d  2]=='/' || z[2]=
3110: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
3120: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28    }.  for(i=0; (
3130: 63 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  c=z[i])!=0; i++)
3140: 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c  {.    if( c=='\\
3150: 27 20 7c 7c 20 63 3d 3d 27 3a 27 20 29 7b 0a 20  ' || c==':' ){. 
3160: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3170: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
3180: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
3190: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 72   z[i+1]=='/' ) r
31a0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69  eturn 0;.      i
31b0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 29  f( z[i+1]=='.' )
31c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
31d0: 69 2b 32 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 69  i+2]=='/' || z[i
31e0: 2b 32 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  +2]==0 ) return 
31f0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  0;.        if( z
3200: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 28 7a  [i+2]=='.' && (z
3210: 5b 69 2b 33 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b  [i+3]=='/' || z[
3220: 69 2b 33 5d 3d 3d 30 29 20 29 20 72 65 74 75 72  i+3]==0) ) retur
3230: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
3240: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 5b 69   }.  }.  if( z[i
3250: 2d 31 5d 3d 3d 27 2f 27 20 29 20 72 65 74 75 72  -1]=='/' ) retur
3260: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
3270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
3280: 20 6c 61 73 74 20 63 6f 6d 70 6f 6e 65 6e 74 20   last component 
3290: 6f 66 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  of the pathname 
32a0: 69 6e 20 7a 5b 30 5d 2e 2e 7a 5b 6a 2d 31 5d 20  in z[0]..z[j-1] 
32b0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  is something.** 
32c0: 6f 74 68 65 72 20 74 68 61 6e 20 22 2e 2e 22 20  other than ".." 
32d0: 74 68 65 6e 20 62 61 63 6b 20 69 74 20 6f 75 74  then back it out
32e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72 75 65   and return true
32f0: 2e 20 20 49 66 20 74 68 65 20 6c 61 73 74 0a 2a  .  If the last.*
3300: 2a 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 73 20 65  * component is e
3310: 6d 70 74 79 20 6f 72 20 69 66 20 69 74 20 69 73  mpty or if it is
3320: 20 22 2e 2e 22 20 74 68 65 6e 20 72 65 74 75 72   ".." then retur
3330: 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74  n false..*/.stat
3340: 69 63 20 69 6e 74 20 62 61 63 6b 75 70 5f 64 69  ic int backup_di
3350: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  r(const char *z,
3360: 20 69 6e 74 20 2a 70 4a 29 7b 0a 20 20 69 6e 74   int *pJ){.  int
3370: 20 6a 20 3d 20 2a 70 4a 3b 0a 20 20 69 6e 74 20   j = *pJ;.  int 
3380: 69 3b 0a 20 20 69 66 28 20 6a 3c 3d 30 20 29 20  i;.  if( j<=0 ) 
3390: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
33a0: 69 3d 6a 2d 31 3b 20 69 3e 30 20 26 26 20 7a 5b  i=j-1; i>0 && z[
33b0: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
33c0: 7d 0a 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2e  }.  if( z[i]=='.
33d0: 27 20 26 26 20 69 3d 3d 6a 2d 32 20 26 26 20 7a  ' && i==j-2 && z
33e0: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 29 20 72 65 74  [i+1]=='.' ) ret
33f0: 75 72 6e 20 30 3b 0a 20 20 2a 70 4a 20 3d 20 69  urn 0;.  *pJ = i
3400: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  -1;.  return 1;.
3410: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66  }../*.** Simplif
3420: 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 62 79 0a  y a filename by.
3430: 2a 2a 0a 2a 2a 20 20 2a 20 43 6f 6e 76 65 72 74  **.**  * Convert
3440: 20 61 6c 6c 20 5c 20 69 6e 74 6f 20 2f 20 6f 6e   all \ into / on
3450: 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 20 2a 20 72   windows.**  * r
3460: 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69  emoving any trai
3470: 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61  ling and duplica
3480: 74 65 20 2f 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76  te /.**  * remov
3490: 69 6e 67 20 2f 2e 2f 0a 2a 2a 20 20 2a 20 72 65  ing /./.**  * re
34a0: 6d 6f 76 69 6e 67 20 2f 41 2f 2e 2e 2f 0a 2a 2a  moving /A/../.**
34b0: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
34c0: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
34d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
34e0: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 20 49  ame length..** I
34f0: 66 20 74 68 65 20 73 6c 61 73 68 20 70 61 72 61  f the slash para
3500: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
3510: 6f 2c 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  o, the trailing 
3520: 73 6c 61 73 68 2c 20 69 66 20 61 6e 79 2c 0a 2a  slash, if any,.*
3530: 2a 20 69 73 20 72 65 74 61 69 6e 65 64 2e 0a 2a  * is retained..*
3540: 2f 0a 69 6e 74 20 66 69 6c 65 5f 73 69 6d 70 6c  /.int file_simpl
3550: 69 66 79 5f 6e 61 6d 65 28 63 68 61 72 20 2a 7a  ify_name(char *z
3560: 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 73 6c 61  , int n, int sla
3570: 73 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  sh){.  int i, j;
3580: 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d  .  if( n<0 ) n =
3590: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 0a 20 20 2f   strlen(z);..  /
35a0: 2a 20 4f 6e 20 77 69 6e 64 6f 77 73 20 63 6f 6e  * On windows con
35b0: 76 65 72 74 20 61 6c 6c 20 5c 20 63 68 61 72 61  vert all \ chara
35c0: 63 74 65 72 73 20 74 6f 20 2f 20 2a 2f 0a 23 69  cters to / */.#i
35d0: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
35e0: 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ).  for(i=0; i<n
35f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
3600: 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29 20 7a 5b 69  z[i]=='\\' ) z[i
3610: 5d 20 3d 20 27 2f 27 3b 0a 20 20 7d 0a 23 65 6e  ] = '/';.  }.#en
3620: 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 69  dif..  /* Removi
3630: 6e 67 20 74 72 61 69 6c 69 6e 67 20 22 2f 22 20  ng trailing "/" 
3640: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
3650: 69 66 20 28 20 21 73 6c 61 73 68 20 29 7b 0a 20  if ( !slash ){. 
3660: 20 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26     while( n>1 &&
3670: 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20   z[n-1]=='/' ){ 
3680: 6e 2d 2d 3b 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  n--; }.  }..  /*
3690: 20 52 65 6d 6f 76 65 20 64 75 70 6c 69 63 61 74   Remove duplicat
36a0: 65 20 27 2f 27 20 63 68 61 72 61 63 74 65 72 73  e '/' characters
36b0: 2e 20 20 45 78 63 65 70 74 2c 20 74 77 6f 20 2f  .  Except, two /
36c0: 2f 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  / at the beginni
36d0: 6e 67 0a 20 20 2a 2a 20 6f 66 20 61 20 70 61 74  ng.  ** of a pat
36e0: 68 6e 61 6d 65 20 69 73 20 61 6c 6c 6f 77 65 64  hname is allowed
36f0: 20 73 69 6e 63 65 20 74 68 69 73 20 69 73 20 69   since this is i
3700: 6d 70 6f 72 74 61 6e 74 20 6f 6e 20 77 69 6e 64  mportant on wind
3710: 6f 77 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ows. */.  for(i=
3720: 6a 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=1; i<n; i++){.
3730: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
3740: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b  ];.    while( z[
3750: 69 5d 3d 3d 27 2f 27 20 26 26 20 69 3c 6e 2d 31  i]=='/' && i<n-1
3760: 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20   && z[i+1]=='/' 
3770: 29 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 20 3d  ) i++;.  }.  n =
3780: 20 6a 3b 0a 0a 20 20 2f 2a 20 53 6b 69 70 20 6f   j;..  /* Skip o
3790: 76 65 72 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ver zero or more
37a0: 20 69 6e 69 74 69 61 6c 20 22 2e 2f 22 20 73 65   initial "./" se
37b0: 71 75 65 6e 63 65 73 20 2a 2f 0a 20 20 66 6f 72  quences */.  for
37c0: 28 69 3d 30 3b 20 69 3c 6e 2d 31 20 26 26 20 7a  (i=0; i<n-1 && z
37d0: 5b 69 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b  [i]=='.' && z[i+
37e0: 31 5d 3d 3d 27 2f 27 3b 20 69 2b 3d 32 29 7b 7d  1]=='/'; i+=2){}
37f0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 70  ..  /* Begin cop
3800: 79 69 6e 67 20 66 72 6f 6d 20 7a 5b 69 5d 20 62  ying from z[i] b
3810: 61 63 6b 20 74 6f 20 7a 5b 6a 5d 2e 2e 2e 20 2a  ack to z[j]... *
3820: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3c 6e  /.  for(j=0; i<n
3830: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
3840: 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[i]=='/' ){.   
3850: 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20     /* Skip over 
3860: 69 6e 74 65 72 6e 61 6c 20 22 2f 2e 22 20 64 69  internal "/." di
3870: 72 65 63 74 6f 72 79 20 63 6f 6d 70 6f 6e 65 6e  rectory componen
3880: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
3890: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 28  z[i+1]=='.' && (
38a0: 69 2b 32 3d 3d 6e 20 7c 7c 20 7a 5b 69 2b 32 5d  i+2==n || z[i+2]
38b0: 3d 3d 27 2f 27 29 20 29 7b 0a 20 20 20 20 20 20  =='/') ){.      
38c0: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
38d0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
38e0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
38f0: 20 74 68 69 73 20 69 73 20 61 20 22 2f 2e 2e 22   this is a "/.."
3900: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6d 70 6f   directory compo
3910: 6e 65 6e 74 20 74 68 65 6e 20 62 61 63 6b 20 6f  nent then back o
3920: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
3930: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 6f 66  previous term of
3940: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
3950: 66 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e  f it is somethin
3960: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2e 2e  g other than "..
3970: 22 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 22 2e  ".      ** or ".
3980: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
3990: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
39a0: 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69   && i+2<n && z[i
39b0: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 28 69 2b 33  +2]=='.' && (i+3
39c0: 3d 3d 6e 20 7c 7c 20 7a 5b 69 2b 33 5d 3d 3d 27  ==n || z[i+3]=='
39d0: 2f 27 29 0a 20 20 20 20 20 20 20 26 26 20 62 61  /').       && ba
39e0: 63 6b 75 70 5f 64 69 72 28 7a 2c 20 26 6a 29 0a  ckup_dir(z, &j).
39f0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
3a00: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
3a10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
3a20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
3a30: 20 6a 3e 3d 30 20 29 20 7a 5b 6a 5d 20 3d 20 7a   j>=0 ) z[j] = z
3a40: 5b 69 5d 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  [i];.    j++;.  
3a50: 7d 0a 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 7a  }.  if( j==0 ) z
3a60: 5b 6a 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20 7a  [j++] = '.';.  z
3a70: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [j] = 0;.  retur
3a80: 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f  n j;.}../*.** CO
3a90: 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 73 69 6d 70  MMAND: test-simp
3aa0: 6c 69 66 79 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  lify-name.**.** 
3ab0: 25 66 6f 73 73 69 6c 20 74 65 73 74 2d 73 69 6d  %fossil test-sim
3ac0: 70 6c 69 66 79 2d 6e 61 6d 65 20 46 49 4c 45 4e  plify-name FILEN
3ad0: 41 4d 45 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 50 72 69  AME....**.** Pri
3ae0: 6e 74 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  nt the simplifie
3af0: 64 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 65 61  d versions of ea
3b00: 63 68 20 46 49 4c 45 4e 41 4d 45 2e 0a 2a 2f 0a  ch FILENAME..*/.
3b10: 76 6f 69 64 20 63 6d 64 5f 74 65 73 74 5f 73 69  void cmd_test_si
3b20: 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 76 6f 69 64  mplify_name(void
3b30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
3b40: 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 69 3d 32  ar *z;.  for(i=2
3b50: 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29  ; i<g.argc; i++)
3b60: 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74  {.    z = mprint
3b70: 66 28 22 25 73 22 2c 20 67 2e 61 72 67 76 5b 69  f("%s", g.argv[i
3b80: 5d 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70  ]);.    fossil_p
3b90: 72 69 6e 74 28 22 5b 25 73 5d 20 2d 3e 20 22 2c  rint("[%s] -> ",
3ba0: 20 7a 29 3b 0a 20 20 20 20 66 69 6c 65 5f 73 69   z);.    file_si
3bb0: 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 7a 2c 20 2d  mplify_name(z, -
3bc0: 31 2c 20 30 29 3b 0a 20 20 20 20 66 6f 73 73 69  1, 0);.    fossi
3bd0: 6c 5f 70 72 69 6e 74 28 22 5b 25 73 5d 5c 6e 22  l_print("[%s]\n"
3be0: 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c  , z);.    fossil
3bf0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a  _free(z);.  }.}.
3c00: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 63  ./*.** Get the c
3c10: 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
3c20: 69 72 65 63 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  irectory..**.** 
3c30: 4f 6e 20 77 69 6e 64 6f 77 73 2c 20 74 68 65 20  On windows, the 
3c40: 6e 61 6d 65 20 69 73 20 63 6f 6e 76 65 72 74 65  name is converte
3c50: 64 20 66 72 6f 6d 20 75 6e 69 63 6f 64 65 20 74  d from unicode t
3c60: 6f 20 55 54 46 38 20 61 6e 64 20 61 6c 6c 20 27  o UTF8 and all '
3c70: 5c 5c 27 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  \\'.** character
3c80: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
3c90: 74 6f 20 27 2f 27 2e 20 20 4e 6f 20 63 6f 6e 76  to '/'.  No conv
3ca0: 65 72 73 69 6f 6e 73 20 61 72 65 20 6e 65 65 64  ersions are need
3cb0: 65 64 20 6f 6e 0a 2a 2a 20 75 6e 69 78 2e 0a 2a  ed on.** unix..*
3cc0: 2f 0a 76 6f 69 64 20 66 69 6c 65 5f 67 65 74 63  /.void file_getc
3cd0: 77 64 28 63 68 61 72 20 2a 7a 42 75 66 2c 20 69  wd(char *zBuf, i
3ce0: 6e 74 20 6e 42 75 66 29 7b 0a 23 69 66 64 65 66  nt nBuf){.#ifdef
3cf0: 20 5f 57 49 4e 33 32 0a 20 20 63 68 61 72 20 2a   _WIN32.  char *
3d00: 7a 50 77 64 55 74 66 38 3b 0a 20 20 69 6e 74 20  zPwdUtf8;.  int 
3d10: 6e 50 77 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nPwd;.  int i;. 
3d20: 20 77 63 68 61 72 5f 74 20 7a 50 77 64 5b 32 30   wchar_t zPwd[20
3d30: 30 30 5d 3b 0a 20 20 69 66 28 20 5f 77 67 65 74  00];.  if( _wget
3d40: 63 77 64 28 7a 50 77 64 2c 20 73 69 7a 65 6f 66  cwd(zPwd, sizeof
3d50: 28 7a 50 77 64 29 2f 73 69 7a 65 6f 66 28 7a 50  (zPwd)/sizeof(zP
3d60: 77 64 5b 30 5d 29 2d 31 29 3d 3d 30 20 29 7b 0a  wd[0])-1)==0 ){.
3d70: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
3d80: 28 22 63 61 6e 6e 6f 74 20 66 69 6e 64 20 74 68  ("cannot find th
3d90: 65 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  e current workin
3da0: 67 20 64 69 72 65 63 74 6f 72 79 2e 22 29 3b 0a  g directory.");.
3db0: 20 20 7d 0a 20 20 7a 50 77 64 55 74 66 38 20 3d    }.  zPwdUtf8 =
3dc0: 20 66 6f 73 73 69 6c 5f 75 6e 69 63 6f 64 65 5f   fossil_unicode_
3dd0: 74 6f 5f 75 74 66 38 28 7a 50 77 64 29 3b 0a 20  to_utf8(zPwd);. 
3de0: 20 6e 50 77 64 20 3d 20 73 74 72 6c 65 6e 28 7a   nPwd = strlen(z
3df0: 50 77 64 55 74 66 38 29 3b 0a 20 20 69 66 28 20  PwdUtf8);.  if( 
3e00: 6e 50 77 64 20 3e 20 6e 42 75 66 2d 31 20 29 7b  nPwd > nBuf-1 ){
3e10: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61  .    fossil_fata
3e20: 6c 28 22 70 77 64 20 74 6f 6f 20 62 69 67 3a 20  l("pwd too big: 
3e30: 6d 61 78 20 25 64 5c 6e 22 2c 20 6e 42 75 66 2d  max %d\n", nBuf-
3e40: 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  1);.  }.  for(i=
3e50: 30 3b 20 7a 50 77 64 55 74 66 38 5b 69 5d 3b 20  0; zPwdUtf8[i]; 
3e60: 69 2b 2b 29 20 69 66 28 20 7a 50 77 64 55 74 66  i++) if( zPwdUtf
3e70: 38 5b 69 5d 3d 3d 27 5c 5c 27 20 29 20 7a 50 77  8[i]=='\\' ) zPw
3e80: 64 55 74 66 38 5b 69 5d 20 3d 20 27 2f 27 3b 0a  dUtf8[i] = '/';.
3e90: 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
3ea0: 50 77 64 55 74 66 38 2c 20 6e 50 77 64 2b 31 29  PwdUtf8, nPwd+1)
3eb0: 3b 0a 20 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f  ;.  fossil_mbcs_
3ec0: 66 72 65 65 28 7a 50 77 64 55 74 66 38 29 3b 0a  free(zPwdUtf8);.
3ed0: 23 65 6c 73 65 0a 20 20 69 66 28 20 67 65 74 63  #else.  if( getc
3ee0: 77 64 28 7a 42 75 66 2c 20 6e 42 75 66 2d 31 29  wd(zBuf, nBuf-1)
3ef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65  ==0 ){.    if( e
3f00: 72 72 6e 6f 3d 3d 45 52 41 4e 47 45 20 29 7b 0a  rrno==ERANGE ){.
3f10: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
3f20: 61 6c 28 22 70 77 64 20 74 6f 6f 20 62 69 67 3a  al("pwd too big:
3f30: 20 6d 61 78 20 25 64 5c 6e 22 2c 20 6e 42 75 66   max %d\n", nBuf
3f40: 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  -1);.    }else{.
3f50: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
3f60: 61 6c 28 22 63 61 6e 6e 6f 74 20 66 69 6e 64 20  al("cannot find 
3f70: 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
3f80: 64 69 72 65 63 74 6f 72 79 3b 20 25 73 22 2c 0a  directory; %s",.
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e     strerror(errn
3fb0: 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  o));.    }.  }.#
3fc0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
3fd0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 50  eturn true if zP
3fe0: 61 74 68 20 69 73 20 61 6e 20 61 62 73 6f 6c 75  ath is an absolu
3ff0: 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65  te pathname.  Re
4000: 74 75 72 6e 20 66 61 6c 73 65 0a 2a 2a 20 69 66  turn false.** if
4010: 20 69 74 20 69 73 20 72 65 6c 61 74 69 76 65 2e   it is relative.
4020: 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 69 73 5f  .*/.int file_is_
4030: 61 62 73 6f 6c 75 74 65 5f 70 61 74 68 28 63 6f  absolute_path(co
4040: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29  nst char *zPath)
4050: 7b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  {.  if( zPath[0]
4060: 3d 3d 27 2f 27 0a 23 69 66 20 64 65 66 69 6e 65  =='/'.#if define
4070: 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20  d(_WIN32).      
4080: 7c 7c 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 5c 5c  || zPath[0]=='\\
4090: 27 0a 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6c  '.      || (strl
40a0: 65 6e 28 7a 50 61 74 68 29 3e 33 20 26 26 20 7a  en(zPath)>3 && z
40b0: 50 61 74 68 5b 31 5d 3d 3d 27 3a 27 0a 20 20 20  Path[1]==':'.   
40c0: 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 61 74          && (zPat
40d0: 68 5b 32 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 7a 50  h[2]=='\\' || zP
40e0: 61 74 68 5b 32 5d 3d 3d 27 2f 27 29 29 0a 23 65  ath[2]=='/')).#e
40f0: 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 72 65  ndif.  ){.    re
4100: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
4110: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4120: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70   }.}../*.** Comp
4130: 75 74 65 20 61 20 63 61 6e 6f 6e 69 63 61 6c 20  ute a canonical 
4140: 70 61 74 68 6e 61 6d 65 20 66 6f 72 20 61 20 66  pathname for a f
4150: 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79  ile or directory
4160: 2e 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 61  ..** Make the na
4170: 6d 65 20 61 62 73 6f 6c 75 74 65 20 69 66 20 69  me absolute if i
4180: 74 20 69 73 20 72 65 6c 61 74 69 76 65 2e 0a 2a  t is relative..*
4190: 2a 20 52 65 6d 6f 76 65 20 72 65 64 75 6e 64 61  * Remove redunda
41a0: 6e 74 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a  nt / characters.
41b0: 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 2f 2e  ** Remove all /.
41c0: 2f 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 2e  / path elements.
41d0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 2f 41 2f 2e  .** Convert /A/.
41e0: 2e 2f 20 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20  ./ to just /.** 
41f0: 49 66 20 74 68 65 20 73 6c 61 73 68 20 70 61 72  If the slash par
4200: 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
4210: 72 6f 2c 20 74 68 65 20 74 72 61 69 6c 69 6e 67  ro, the trailing
4220: 20 73 6c 61 73 68 2c 20 69 66 20 61 6e 79 2c 0a   slash, if any,.
4230: 2a 2a 20 69 73 20 72 65 74 61 69 6e 65 64 2e 0a  ** is retained..
4240: 2a 2f 0a 76 6f 69 64 20 66 69 6c 65 5f 63 61 6e  */.void file_can
4250: 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 63 6f 6e 73  onical_name(cons
4260: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 4e 61 6d  t char *zOrigNam
4270: 65 2c 20 42 6c 6f 62 20 2a 70 4f 75 74 2c 20 69  e, Blob *pOut, i
4280: 6e 74 20 73 6c 61 73 68 29 7b 0a 20 20 69 66 28  nt slash){.  if(
4290: 20 66 69 6c 65 5f 69 73 5f 61 62 73 6f 6c 75 74   file_is_absolut
42a0: 65 5f 70 61 74 68 28 7a 4f 72 69 67 4e 61 6d 65  e_path(zOrigName
42b0: 29 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  ) ){.#if defined
42c0: 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 63 68 61  (_WIN32).    cha
42d0: 72 20 2a 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a  r *zOut;.#endif.
42e0: 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 70 4f 75      blob_set(pOu
42f0: 74 2c 20 7a 4f 72 69 67 4e 61 6d 65 29 3b 0a 20  t, zOrigName);. 
4300: 20 20 20 62 6c 6f 62 5f 6d 61 74 65 72 69 61 6c     blob_material
4310: 69 7a 65 28 70 4f 75 74 29 3b 0a 23 69 66 20 64  ize(pOut);.#if d
4320: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
4330: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4f 6e 20     /*.    ** On 
4340: 57 69 6e 64 6f 77 73 2c 20 6e 6f 72 6d 61 6c 69  Windows, normali
4350: 7a 65 20 74 68 65 20 64 72 69 76 65 20 6c 65 74  ze the drive let
4360: 74 65 72 20 74 6f 20 75 70 70 65 72 20 63 61 73  ter to upper cas
4370: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4f  e..    */.    zO
4380: 75 74 20 3d 20 62 6c 6f 62 5f 73 74 72 28 70 4f  ut = blob_str(pO
4390: 75 74 29 3b 0a 20 20 20 20 69 66 28 20 66 6f 73  ut);.    if( fos
43a0: 73 69 6c 5f 69 73 61 6c 70 68 61 28 7a 4f 75 74  sil_isalpha(zOut
43b0: 5b 30 5d 29 20 26 26 20 7a 4f 75 74 5b 31 5d 3d  [0]) && zOut[1]=
43c0: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 7a 4f  =':' ){.      zO
43d0: 75 74 5b 30 5d 20 3d 20 66 6f 73 73 69 6c 5f 74  ut[0] = fossil_t
43e0: 6f 75 70 70 65 72 28 7a 4f 75 74 5b 30 5d 29 3b  oupper(zOut[0]);
43f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4400: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
4410: 7a 50 77 64 5b 32 30 30 30 5d 3b 0a 20 20 20 20  zPwd[2000];.    
4420: 66 69 6c 65 5f 67 65 74 63 77 64 28 7a 50 77 64  file_getcwd(zPwd
4430: 2c 20 73 69 7a 65 6f 66 28 7a 50 77 64 29 2d 73  , sizeof(zPwd)-s
4440: 74 72 6c 65 6e 28 7a 4f 72 69 67 4e 61 6d 65 29  trlen(zOrigName)
4450: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  );.#if defined(_
4460: 57 49 4e 33 32 29 0a 20 20 20 20 2f 2a 0a 20 20  WIN32).    /*.  
4470: 20 20 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c    ** On Windows,
4480: 20 6e 6f 72 6d 61 6c 69 7a 65 20 74 68 65 20 64   normalize the d
4490: 72 69 76 65 20 6c 65 74 74 65 72 20 74 6f 20 75  rive letter to u
44a0: 70 70 65 72 20 63 61 73 65 2e 0a 20 20 20 20 2a  pper case..    *
44b0: 2f 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c  /.    if( fossil
44c0: 5f 69 73 61 6c 70 68 61 28 7a 50 77 64 5b 30 5d  _isalpha(zPwd[0]
44d0: 29 20 26 26 20 7a 50 77 64 5b 31 5d 3d 3d 27 3a  ) && zPwd[1]==':
44e0: 27 20 29 7b 0a 20 20 20 20 20 20 7a 50 77 64 5b  ' ){.      zPwd[
44f0: 30 5d 20 3d 20 66 6f 73 73 69 6c 5f 74 6f 75 70  0] = fossil_toup
4500: 70 65 72 28 7a 50 77 64 5b 30 5d 29 3b 0a 20 20  per(zPwd[0]);.  
4510: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
4520: 6c 6f 62 5f 7a 65 72 6f 28 70 4f 75 74 29 3b 0a  lob_zero(pOut);.
4530: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
4540: 28 70 4f 75 74 2c 20 22 25 2f 2f 25 2f 22 2c 20  (pOut, "%//%/", 
4550: 7a 50 77 64 2c 20 7a 4f 72 69 67 4e 61 6d 65 29  zPwd, zOrigName)
4560: 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73  ;.  }.  blob_res
4570: 69 7a 65 28 70 4f 75 74 2c 20 66 69 6c 65 5f 73  ize(pOut, file_s
4580: 69 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 62 6c 6f  implify_name(blo
4590: 62 5f 62 75 66 66 65 72 28 70 4f 75 74 29 2c 0a  b_buffer(pOut),.
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65         blob_size
45d0: 28 70 4f 75 74 29 2c 20 73 6c 61 73 68 29 29 3b  (pOut), slash));
45e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e  .}../*.** COMMAN
45f0: 44 3a 20 20 74 65 73 74 2d 63 61 6e 6f 6e 69 63  D:  test-canonic
4600: 61 6c 2d 6e 61 6d 65 0a 2a 2a 20 55 73 61 67 65  al-name.** Usage
4610: 3a 20 25 66 6f 73 73 69 6c 20 74 65 73 74 2d 63  : %fossil test-c
4620: 61 6e 6f 6e 69 63 61 6c 2d 6e 61 6d 65 20 46 49  anonical-name FI
4630: 4c 45 4e 41 4d 45 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LENAME....**.** 
4640: 54 65 73 74 20 74 68 65 20 6f 70 65 72 61 74 69  Test the operati
4650: 6f 6e 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  on of the canoni
4660: 63 61 6c 20 6e 61 6d 65 20 67 65 6e 65 72 61 74  cal name generat
4670: 6f 72 2e 0a 2a 2a 20 41 6c 73 6f 20 74 65 73 74  or..** Also test
4680: 20 46 6f 73 73 69 6c 27 73 20 61 62 69 6c 69 74   Fossil's abilit
4690: 79 20 74 6f 20 6d 65 61 73 75 72 65 20 61 74 74  y to measure att
46a0: 72 69 62 75 74 65 73 20 6f 66 20 61 20 66 69 6c  ributes of a fil
46b0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 74  e..*/.void cmd_t
46c0: 65 73 74 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61  est_canonical_na
46d0: 6d 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  me(void){.  int 
46e0: 69 3b 0a 20 20 42 6c 6f 62 20 78 3b 0a 20 20 62  i;.  Blob x;.  b
46f0: 6c 6f 62 5f 7a 65 72 6f 28 26 78 29 3b 0a 20 20  lob_zero(&x);.  
4700: 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67  for(i=2; i<g.arg
4710: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  c; i++){.    cha
4720: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20  r zBuf[100];.   
4730: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4740: 6d 65 20 3d 20 67 2e 61 72 67 76 5b 69 5d 3b 0a  me = g.argv[i];.
4750: 20 20 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63      file_canonic
4760: 61 6c 5f 6e 61 6d 65 28 7a 4e 61 6d 65 2c 20 26  al_name(zName, &
4770: 78 2c 20 30 29 3b 0a 20 20 20 20 66 6f 73 73 69  x, 0);.    fossi
4780: 6c 5f 70 72 69 6e 74 28 22 5b 25 73 5d 20 2d 3e  l_print("[%s] ->
4790: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 4e 61 6d 65 2c   [%s]\n", zName,
47a0: 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 78 29   blob_buffer(&x)
47b0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
47c0: 74 28 26 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  t(&x);.    sqlit
47d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
47e0: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
47f0: 22 25 6c 6c 64 22 2c 20 66 69 6c 65 5f 77 64 5f  "%lld", file_wd_
4800: 73 69 7a 65 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  size(zName));.  
4810: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
4820: 20 20 66 69 6c 65 5f 73 69 7a 65 20 20 20 3d 20    file_size   = 
4830: 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20  %s\n", zBuf);.  
4840: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4850: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
4860: 20 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 66   zBuf, "%lld", f
4870: 69 6c 65 5f 77 64 5f 6d 74 69 6d 65 28 7a 4e 61  ile_wd_mtime(zNa
4880: 6d 65 29 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c  me));.    fossil
4890: 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f 6d  _print("  file_m
48a0: 74 69 6d 65 20 20 3d 20 25 73 5c 6e 22 2c 20 7a  time  = %s\n", z
48b0: 42 75 66 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c  Buf);.    fossil
48c0: 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f 69  _print("  file_i
48d0: 73 66 69 6c 65 20 3d 20 25 64 5c 6e 22 2c 20 66  sfile = %d\n", f
48e0: 69 6c 65 5f 77 64 5f 69 73 66 69 6c 65 28 7a 4e  ile_wd_isfile(zN
48f0: 61 6d 65 29 29 3b 0a 20 20 20 20 66 6f 73 73 69  ame));.    fossi
4900: 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f  l_print("  file_
4910: 69 73 66 69 6c 65 5f 6f 72 5f 6c 69 6e 6b 20 3d  isfile_or_link =
4920: 20 25 64 5c 6e 22 2c 66 69 6c 65 5f 77 64 5f 69   %d\n",file_wd_i
4930: 73 66 69 6c 65 5f 6f 72 5f 6c 69 6e 6b 28 7a 4e  sfile_or_link(zN
4940: 61 6d 65 29 29 3b 0a 20 20 20 20 66 6f 73 73 69  ame));.    fossi
4950: 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f  l_print("  file_
4960: 69 73 6c 69 6e 6b 20 3d 20 25 64 5c 6e 22 2c 20  islink = %d\n", 
4970: 66 69 6c 65 5f 77 64 5f 69 73 6c 69 6e 6b 28 7a  file_wd_islink(z
4980: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 66 6f 73 73  Name));.    foss
4990: 69 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65  il_print("  file
49a0: 5f 69 73 65 78 65 20 20 3d 20 25 64 5c 6e 22 2c  _isexe  = %d\n",
49b0: 20 66 69 6c 65 5f 77 64 5f 69 73 65 78 65 28 7a   file_wd_isexe(z
49c0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 66 6f 73 73  Name));.    foss
49d0: 69 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65  il_print("  file
49e0: 5f 69 73 64 69 72 20 20 3d 20 25 64 5c 6e 22 2c  _isdir  = %d\n",
49f0: 20 66 69 6c 65 5f 77 64 5f 69 73 64 69 72 28 7a   file_wd_isdir(z
4a00: 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Name));.  }.}../
4a10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
4a20: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 66 69   if the given fi
4a30: 6c 65 6e 61 6d 65 20 69 73 20 63 61 6e 6f 6e 69  lename is canoni
4a40: 63 61 6c 2e 0a 2a 2a 0a 2a 2a 20 43 61 6e 6f 6e  cal..**.** Canon
4a50: 69 63 61 6c 20 6e 61 6d 65 73 20 61 72 65 20 66  ical names are f
4a60: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 73 20 75 73  ull pathnames us
4a70: 69 6e 67 20 22 2f 22 20 6e 6f 74 20 22 5c 22 20  ing "/" not "\" 
4a80: 61 6e 64 20 77 68 69 63 68 0a 2a 2a 20 63 6f 6e  and which.** con
4a90: 74 61 69 6e 20 6e 6f 20 22 2f 2e 2f 22 20 6f 72  tain no "/./" or
4aa0: 20 22 2f 2e 2e 2f 22 20 74 65 72 6d 73 2e 0a 2a   "/../" terms..*
4ab0: 2f 0a 69 6e 74 20 66 69 6c 65 5f 69 73 5f 63 61  /.int file_is_ca
4ac0: 6e 6f 6e 69 63 61 6c 28 63 6f 6e 73 74 20 63 68  nonical(const ch
4ad0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
4ae0: 0a 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2f 27  .  if( z[0]!='/'
4af0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
4b00: 4e 33 32 29 0a 20 20 20 20 26 26 20 28 7a 5b 30  N32).    && (z[0
4b10: 5d 3d 3d 30 20 7c 7c 20 7a 5b 31 5d 21 3d 27 3a  ]==0 || z[1]!=':
4b20: 27 20 7c 7c 20 7a 5b 32 5d 21 3d 27 2f 27 29 0a  ' || z[2]!='/').
4b30: 23 65 6e 64 69 66 0a 20 20 29 20 72 65 74 75 72  #endif.  ) retur
4b40: 6e 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  n 0;..  for(i=0;
4b50: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
4b60: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20   if( z[i]=='\\' 
4b70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
4b80: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b  if( z[i]=='/' ){
4b90: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
4ba0: 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
4bb0: 20 20 69 66 28 20 7a 5b 69 2b 32 5d 3d 3d 27 2f    if( z[i+2]=='/
4bc0: 27 20 7c 7c 20 7a 5b 69 2b 32 5d 3d 3d 30 20 29  ' || z[i+2]==0 )
4bd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
4be0: 20 20 20 69 66 28 20 7a 5b 69 2b 32 5d 3d 3d 27     if( z[i+2]=='
4bf0: 2e 27 20 26 26 20 28 7a 5b 69 2b 33 5d 3d 3d 27  .' && (z[i+3]=='
4c00: 2f 27 20 7c 7c 20 7a 5b 69 2b 33 5d 3d 3d 30 29  /' || z[i+3]==0)
4c10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
4c20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4c30: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
4c40: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
4c50: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
4c60: 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 61  t character in a
4c70: 20 70 61 74 68 6e 61 6d 65 20 70 61 73 74 20 74   pathname past t
4c80: 68 65 0a 2a 2a 20 64 72 69 76 65 20 6c 65 74 74  he.** drive lett
4c90: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
4ca0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20  e is a no-op on 
4cb0: 75 6e 69 78 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66  unix..*/.char *f
4cc0: 69 6c 65 5f 77 69 74 68 6f 75 74 5f 64 72 69 76  ile_without_driv
4cd0: 65 5f 6c 65 74 74 65 72 28 63 68 61 72 20 2a 7a  e_letter(char *z
4ce0: 49 6e 29 7b 0a 23 69 66 64 65 66 20 5f 57 49 4e  In){.#ifdef _WIN
4cf0: 33 32 0a 20 20 69 66 28 20 66 6f 73 73 69 6c 5f  32.  if( fossil_
4d00: 69 73 61 6c 70 68 61 28 7a 49 6e 5b 30 5d 29 20  isalpha(zIn[0]) 
4d10: 26 26 20 7a 49 6e 5b 31 5d 3d 3d 27 3a 27 20 29  && zIn[1]==':' )
4d20: 20 7a 49 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69   zIn += 2;.#endi
4d30: 66 0a 20 20 72 65 74 75 72 6e 20 7a 49 6e 3b 0a  f.  return zIn;.
4d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
4d50: 20 61 20 70 61 74 68 6e 61 6d 65 20 66 6f 72 20   a pathname for 
4d60: 61 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74  a file or direct
4d70: 6f 72 79 20 74 68 61 74 20 69 73 20 72 65 6c 61  ory that is rela
4d80: 74 69 76 65 0a 2a 2a 20 74 6f 20 74 68 65 20 63  tive.** to the c
4d90: 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  urrent directory
4da0: 2e 20 20 49 66 20 74 68 65 20 73 6c 61 73 68 20  .  If the slash 
4db0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
4dc0: 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 20 74 72  -zero,.** the tr
4dd0: 61 69 6c 69 6e 67 20 73 6c 61 73 68 2c 20 69 66  ailing slash, if
4de0: 20 61 6e 79 2c 20 69 73 20 72 65 74 61 69 6e 65   any, is retaine
4df0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c 65 5f  d..*/.void file_
4e00: 72 65 6c 61 74 69 76 65 5f 6e 61 6d 65 28 63 6f  relative_name(co
4e10: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 4e  nst char *zOrigN
4e20: 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 4f 75 74 2c  ame, Blob *pOut,
4e30: 20 69 6e 74 20 73 6c 61 73 68 29 7b 0a 20 20 63   int slash){.  c
4e40: 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 62 6c  har *zPath;.  bl
4e50: 6f 62 5f 73 65 74 28 70 4f 75 74 2c 20 7a 4f 72  ob_set(pOut, zOr
4e60: 69 67 4e 61 6d 65 29 3b 0a 20 20 62 6c 6f 62 5f  igName);.  blob_
4e70: 72 65 73 69 7a 65 28 70 4f 75 74 2c 20 66 69 6c  resize(pOut, fil
4e80: 65 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65 28  e_simplify_name(
4e90: 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 4f 75 74  blob_buffer(pOut
4ea0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
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 62 6c 6f 62 5f 73            blob_s
4ed0: 69 7a 65 28 70 4f 75 74 29 2c 20 73 6c 61 73 68  ize(pOut), slash
4ee0: 29 29 3b 0a 20 20 7a 50 61 74 68 20 3d 20 66 69  ));.  zPath = fi
4ef0: 6c 65 5f 77 69 74 68 6f 75 74 5f 64 72 69 76 65  le_without_drive
4f00: 5f 6c 65 74 74 65 72 28 62 6c 6f 62 5f 62 75 66  _letter(blob_buf
4f10: 66 65 72 28 70 4f 75 74 29 29 3b 0a 20 20 69 66  fer(pOut));.  if
4f20: 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
4f30: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
4f40: 0a 20 20 20 20 42 6c 6f 62 20 74 6d 70 3b 0a 20  .    Blob tmp;. 
4f50: 20 20 20 63 68 61 72 20 2a 7a 50 77 64 3b 0a 20     char *zPwd;. 
4f60: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30     char zBuf[200
4f70: 30 5d 3b 0a 20 20 20 20 7a 50 77 64 20 3d 20 7a  0];.    zPwd = z
4f80: 42 75 66 3b 0a 20 20 20 20 66 69 6c 65 5f 67 65  Buf;.    file_ge
4f90: 74 63 77 64 28 7a 42 75 66 2c 20 73 69 7a 65 6f  tcwd(zBuf, sizeo
4fa0: 66 28 7a 42 75 66 29 2d 32 30 29 3b 0a 20 20 20  f(zBuf)-20);.   
4fb0: 20 7a 50 77 64 20 3d 20 66 69 6c 65 5f 77 69 74   zPwd = file_wit
4fc0: 68 6f 75 74 5f 64 72 69 76 65 5f 6c 65 74 74 65  hout_drive_lette
4fd0: 72 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 20 3d  r(zBuf);.    i =
4fe0: 20 31 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33   1;.#ifdef _WIN3
4ff0: 32 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61  2.    while( zPa
5000: 74 68 5b 69 5d 20 26 26 20 66 6f 73 73 69 6c 5f  th[i] && fossil_
5010: 74 6f 6c 6f 77 65 72 28 7a 50 77 64 5b 69 5d 29  tolower(zPwd[i])
5020: 3d 3d 66 6f 73 73 69 6c 5f 74 6f 6c 6f 77 65 72  ==fossil_tolower
5030: 28 7a 50 61 74 68 5b 69 5d 29 20 29 20 69 2b 2b  (zPath[i]) ) i++
5040: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c  ;.#else.    whil
5050: 65 28 20 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a  e( zPath[i] && z
5060: 50 77 64 5b 69 5d 3d 3d 7a 50 61 74 68 5b 69 5d  Pwd[i]==zPath[i]
5070: 20 29 20 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20   ) i++;.#endif. 
5080: 20 20 20 69 66 28 20 7a 50 61 74 68 5b 69 5d 3d     if( zPath[i]=
5090: 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  =0 ){.      blob
50a0: 5f 72 65 73 65 74 28 70 4f 75 74 29 3b 0a 20 20  _reset(pOut);.  
50b0: 20 20 20 20 69 66 28 20 7a 50 77 64 5b 69 5d 3d      if( zPwd[i]=
50c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c  =0 ){.        bl
50d0: 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20  ob_append(pOut, 
50e0: 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ".", 1);.      }
50f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 6c  else{.        bl
5100: 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20  ob_append(pOut, 
5110: 22 2e 2e 22 2c 20 32 29 3b 0a 20 20 20 20 20 20  "..", 2);.      
5120: 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 7a 50 77    for(j=i+1; zPw
5130: 64 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  d[j]; j++){.    
5140: 20 20 20 20 20 20 69 66 28 20 7a 50 77 64 5b 6a        if( zPwd[j
5150: 5d 3d 3d 27 2f 27 20 29 20 7b 0a 20 20 20 20 20  ]=='/' ) {.     
5160: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
5170: 6e 64 28 70 4f 75 74 2c 20 22 2f 2e 2e 22 2c 20  nd(pOut, "/..", 
5180: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  3);.          }.
5190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
51a0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  }.      return;.
51b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 50      }.    if( zP
51c0: 77 64 5b 69 5d 3d 3d 30 20 26 26 20 7a 50 61 74  wd[i]==0 && zPat
51d0: 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[i]=='/' ){.   
51e0: 20 20 20 6d 65 6d 63 70 79 28 26 74 6d 70 2c 20     memcpy(&tmp, 
51f0: 70 4f 75 74 2c 20 73 69 7a 65 6f 66 28 74 6d 70  pOut, sizeof(tmp
5200: 29 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 73  ));.      blob_s
5210: 65 74 28 70 4f 75 74 2c 20 22 2e 2f 22 29 3b 0a  et(pOut, "./");.
5220: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
5230: 64 28 70 4f 75 74 2c 20 26 7a 50 61 74 68 5b 69  d(pOut, &zPath[i
5240: 2b 31 5d 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  +1], -1);.      
5250: 62 6c 6f 62 5f 72 65 73 65 74 28 26 74 6d 70 29  blob_reset(&tmp)
5260: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
5270: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
5280: 20 7a 50 61 74 68 5b 69 2d 31 5d 21 3d 27 2f 27   zPath[i-1]!='/'
5290: 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 62   ){ i--; }.    b
52a0: 6c 6f 62 5f 73 65 74 28 26 74 6d 70 2c 20 22 2e  lob_set(&tmp, ".
52b0: 2e 2f 22 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ./");.    for(j=
52c0: 69 3b 20 7a 50 77 64 5b 6a 5d 3b 20 6a 2b 2b 29  i; zPwd[j]; j++)
52d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 77 64  {.      if( zPwd
52e0: 5b 6a 5d 3d 3d 27 2f 27 20 29 20 7b 0a 20 20 20  [j]=='/' ) {.   
52f0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
5300: 28 26 74 6d 70 2c 20 22 2e 2e 2f 22 2c 20 33 29  (&tmp, "../", 3)
5310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5320: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
5330: 26 74 6d 70 2c 20 26 7a 50 61 74 68 5b 69 5d 2c  &tmp, &zPath[i],
5340: 20 2d 31 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72   -1);.    blob_r
5350: 65 73 65 74 28 70 4f 75 74 29 3b 0a 20 20 20 20  eset(pOut);.    
5360: 6d 65 6d 63 70 79 28 70 4f 75 74 2c 20 26 74 6d  memcpy(pOut, &tm
5370: 70 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b  p, sizeof(tmp));
5380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f  .  }.}../*.** CO
5390: 4d 4d 41 4e 44 3a 20 20 74 65 73 74 2d 72 65 6c  MMAND:  test-rel
53a0: 61 74 69 76 65 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a  ative-name.**.**
53b0: 20 54 65 73 74 20 74 68 65 20 6f 70 65 72 61 74   Test the operat
53c0: 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 6c 61 74  ion of the relat
53d0: 69 76 65 20 6e 61 6d 65 20 67 65 6e 65 72 61 74  ive name generat
53e0: 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f  or..*/.void cmd_
53f0: 74 65 73 74 5f 72 65 6c 61 74 69 76 65 5f 6e 61  test_relative_na
5400: 6d 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  me(void){.  int 
5410: 69 3b 0a 20 20 42 6c 6f 62 20 78 3b 0a 20 20 62  i;.  Blob x;.  b
5420: 6c 6f 62 5f 7a 65 72 6f 28 26 78 29 3b 0a 20 20  lob_zero(&x);.  
5430: 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67  for(i=2; i<g.arg
5440: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 69 6c  c; i++){.    fil
5450: 65 5f 72 65 6c 61 74 69 76 65 5f 6e 61 6d 65 28  e_relative_name(
5460: 67 2e 61 72 67 76 5b 69 5d 2c 20 26 78 2c 20 30  g.argv[i], &x, 0
5470: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72  );.    fossil_pr
5480: 69 6e 74 28 22 25 73 5c 6e 22 2c 20 62 6c 6f 62  int("%s\n", blob
5490: 5f 62 75 66 66 65 72 28 26 78 29 29 3b 0a 20 20  _buffer(&x));.  
54a0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 78 29    blob_reset(&x)
54b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
54c0: 6f 6d 70 75 74 65 20 61 20 70 61 74 68 6e 61 6d  ompute a pathnam
54d0: 65 20 66 6f 72 20 61 20 66 69 6c 65 20 72 65 6c  e for a file rel
54e0: 61 74 69 76 65 20 74 6f 20 74 68 65 20 72 6f 6f  ative to the roo
54f0: 74 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  t of the local.*
5500: 2a 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  * tree.  Return 
5510: 54 52 55 45 20 6f 6e 20 73 75 63 63 65 73 73 2e  TRUE on success.
5520: 20 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 70 72    On failure, pr
5530: 69 6e 74 20 61 6e 64 20 65 72 72 6f 72 0a 2a 2a  int and error.**
5540: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 71 75 69   message and qui
5550: 74 20 69 66 20 74 68 65 20 65 72 72 46 61 74 61  t if the errFata
5560: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 20  l flag is true. 
5570: 20 49 66 20 65 72 72 46 61 74 61 6c 20 69 73 0a   If errFatal is.
5580: 2a 2a 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 73  ** false, then s
5590: 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 30 2e 0a  imply return 0..
55a0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 6f  **.** The root o
55b0: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 64 65  f the tree is de
55c0: 66 69 6e 65 64 20 62 79 20 74 68 65 20 67 2e 7a  fined by the g.z
55d0: 4c 6f 63 61 6c 52 6f 6f 74 20 76 61 72 69 61 62  LocalRoot variab
55e0: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f  le..*/.int file_
55f0: 74 72 65 65 5f 6e 61 6d 65 28 63 6f 6e 73 74 20  tree_name(const 
5600: 63 68 61 72 20 2a 7a 4f 72 69 67 4e 61 6d 65 2c  char *zOrigName,
5610: 20 42 6c 6f 62 20 2a 70 4f 75 74 2c 20 69 6e 74   Blob *pOut, int
5620: 20 65 72 72 46 61 74 61 6c 29 7b 0a 20 20 42 6c   errFatal){.  Bl
5630: 6f 62 20 6c 6f 63 61 6c 52 6f 6f 74 3b 0a 20 20  ob localRoot;.  
5640: 69 6e 74 20 6e 4c 6f 63 61 6c 52 6f 6f 74 3b 0a  int nLocalRoot;.
5650: 20 20 63 68 61 72 20 2a 7a 4c 6f 63 61 6c 52 6f    char *zLocalRo
5660: 6f 74 3b 0a 20 20 42 6c 6f 62 20 66 75 6c 6c 3b  ot;.  Blob full;
5670: 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 3b 0a 20 20  .  int nFull;.  
5680: 63 68 61 72 20 2a 7a 46 75 6c 6c 3b 0a 0a 20 20  char *zFull;..  
5690: 62 6c 6f 62 5f 7a 65 72 6f 28 70 4f 75 74 29 3b  blob_zero(pOut);
56a0: 0a 20 20 64 62 5f 6d 75 73 74 5f 62 65 5f 77 69  .  db_must_be_wi
56b0: 74 68 69 6e 5f 74 72 65 65 28 29 3b 0a 20 20 66  thin_tree();.  f
56c0: 69 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61  ile_canonical_na
56d0: 6d 65 28 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c  me(g.zLocalRoot,
56e0: 20 26 6c 6f 63 61 6c 52 6f 6f 74 2c 20 31 29 3b   &localRoot, 1);
56f0: 0a 20 20 6e 4c 6f 63 61 6c 52 6f 6f 74 20 3d 20  .  nLocalRoot = 
5700: 62 6c 6f 62 5f 73 69 7a 65 28 26 6c 6f 63 61 6c  blob_size(&local
5710: 52 6f 6f 74 29 3b 0a 20 20 7a 4c 6f 63 61 6c 52  Root);.  zLocalR
5720: 6f 6f 74 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65  oot = blob_buffe
5730: 72 28 26 6c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20  r(&localRoot);. 
5740: 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 52   assert( nLocalR
5750: 6f 6f 74 3e 30 20 26 26 20 7a 4c 6f 63 61 6c 52  oot>0 && zLocalR
5760: 6f 6f 74 5b 6e 4c 6f 63 61 6c 52 6f 6f 74 2d 31  oot[nLocalRoot-1
5770: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 66 69 6c 65  ]=='/' );.  file
5780: 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28  _canonical_name(
5790: 7a 4f 72 69 67 4e 61 6d 65 2c 20 26 66 75 6c 6c  zOrigName, &full
57a0: 2c 20 30 29 3b 0a 20 20 6e 46 75 6c 6c 20 3d 20  , 0);.  nFull = 
57b0: 62 6c 6f 62 5f 73 69 7a 65 28 26 66 75 6c 6c 29  blob_size(&full)
57c0: 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20 62 6c 6f 62  ;.  zFull = blob
57d0: 5f 62 75 66 66 65 72 28 26 66 75 6c 6c 29 3b 0a  _buffer(&full);.
57e0: 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
57f0: 73 65 2e 20 20 7a 4f 72 69 67 4e 61 6d 65 20 72  se.  zOrigName r
5800: 65 66 65 72 73 20 74 6f 20 67 2e 7a 4c 6f 63 61  efers to g.zLoca
5810: 6c 52 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 2e  lRoot directory.
5820: 20 2a 2f 0a 20 20 69 66 28 20 6e 46 75 6c 6c 3d   */.  if( nFull=
5830: 3d 6e 4c 6f 63 61 6c 52 6f 6f 74 2d 31 20 26 26  =nLocalRoot-1 &&
5840: 20 6d 65 6d 63 6d 70 28 7a 4c 6f 63 61 6c 52 6f   memcmp(zLocalRo
5850: 6f 74 2c 20 7a 46 75 6c 6c 2c 20 6e 46 75 6c 6c  ot, zFull, nFull
5860: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 62 6c 6f 62  )==0 ){.    blob
5870: 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 22 2e  _append(pOut, ".
5880: 22 2c 20 31 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  ", 1);.    blob_
5890: 72 65 73 65 74 28 26 6c 6f 63 61 6c 52 6f 6f 74  reset(&localRoot
58a0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
58b0: 74 28 26 66 75 6c 6c 29 3b 0a 20 20 20 20 72 65  t(&full);.    re
58c0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 69  turn 1;.  }..  i
58d0: 66 28 20 6e 46 75 6c 6c 3c 3d 6e 4c 6f 63 61 6c  f( nFull<=nLocal
58e0: 52 6f 6f 74 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a  Root || memcmp(z
58f0: 4c 6f 63 61 6c 52 6f 6f 74 2c 20 7a 46 75 6c 6c  LocalRoot, zFull
5900: 2c 20 6e 4c 6f 63 61 6c 52 6f 6f 74 29 20 29 7b  , nLocalRoot) ){
5910: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  .    blob_reset(
5920: 26 6c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 20  &localRoot);.   
5930: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 75 6c   blob_reset(&ful
5940: 6c 29 3b 0a 20 20 20 20 69 66 28 20 65 72 72 46  l);.    if( errF
5950: 61 74 61 6c 20 29 7b 0a 20 20 20 20 20 20 66 6f  atal ){.      fo
5960: 73 73 69 6c 5f 66 61 74 61 6c 28 22 66 69 6c 65  ssil_fatal("file
5970: 20 6f 75 74 73 69 64 65 20 6f 66 20 63 68 65 63   outside of chec
5980: 6b 6f 75 74 20 74 72 65 65 3a 20 25 73 22 2c 20  kout tree: %s", 
5990: 7a 4f 72 69 67 4e 61 6d 65 29 3b 0a 20 20 20 20  zOrigName);.    
59a0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
59b0: 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e    }.  blob_appen
59c0: 64 28 70 4f 75 74 2c 20 26 7a 46 75 6c 6c 5b 6e  d(pOut, &zFull[n
59d0: 4c 6f 63 61 6c 52 6f 6f 74 5d 2c 20 6e 46 75 6c  LocalRoot], nFul
59e0: 6c 2d 6e 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20  l-nLocalRoot);. 
59f0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6c 6f 63   blob_reset(&loc
5a00: 61 6c 52 6f 6f 74 29 3b 0a 20 20 62 6c 6f 62 5f  alRoot);.  blob_
5a10: 72 65 73 65 74 28 26 66 75 6c 6c 29 3b 0a 20 20  reset(&full);.  
5a20: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
5a30: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 20 74 65 73  ** COMMAND:  tes
5a40: 74 2d 74 72 65 65 2d 6e 61 6d 65 0a 2a 2a 0a 2a  t-tree-name.**.*
5a50: 2a 20 54 65 73 74 20 74 68 65 20 6f 70 65 72 61  * Test the opera
5a60: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 72 65 65  tion of the tree
5a70: 20 6e 61 6d 65 20 67 65 6e 65 72 61 74 6f 72 2e   name generator.
5a80: 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 74 65 73  .*/.void cmd_tes
5a90: 74 5f 74 72 65 65 5f 6e 61 6d 65 28 76 6f 69 64  t_tree_name(void
5aa0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c  ){.  int i;.  Bl
5ab0: 6f 62 20 78 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72  ob x;.  blob_zer
5ac0: 6f 28 26 78 29 3b 0a 20 20 66 6f 72 28 69 3d 32  o(&x);.  for(i=2
5ad0: 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29  ; i<g.argc; i++)
5ae0: 7b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 74  {.    if( file_t
5af0: 72 65 65 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b  ree_name(g.argv[
5b00: 69 5d 2c 20 26 78 2c 20 31 29 20 29 7b 0a 20 20  i], &x, 1) ){.  
5b10: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
5b20: 28 22 25 73 5c 6e 22 2c 20 62 6c 6f 62 5f 62 75  ("%s\n", blob_bu
5b30: 66 66 65 72 28 26 78 29 29 3b 0a 20 20 20 20 20  ffer(&x));.     
5b40: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 78 29 3b   blob_reset(&x);
5b50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
5b60: 0a 2a 2a 20 50 61 72 73 65 20 61 20 55 52 49 20  .** Parse a URI 
5b70: 69 6e 74 6f 20 73 63 68 65 6d 65 2c 20 68 6f 73  into scheme, hos
5b80: 74 2c 20 70 6f 72 74 2c 20 61 6e 64 20 70 61 74  t, port, and pat
5b90: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c 65 5f  h..*/.void file_
5ba0: 70 61 72 73 65 5f 75 72 69 28 0a 20 20 63 6f 6e  parse_uri(.  con
5bb0: 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 0a 20  st char *zUri,. 
5bc0: 20 42 6c 6f 62 20 2a 70 53 63 68 65 6d 65 2c 0a   Blob *pScheme,.
5bd0: 20 20 42 6c 6f 62 20 2a 70 48 6f 73 74 2c 0a 20    Blob *pHost,. 
5be0: 20 69 6e 74 20 2a 70 50 6f 72 74 2c 0a 20 20 42   int *pPort,.  B
5bf0: 6c 6f 62 20 2a 70 50 61 74 68 0a 29 7b 0a 20 20  lob *pPath.){.  
5c00: 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72  int i, j;..  for
5c10: 28 69 3d 30 3b 20 7a 55 72 69 5b 69 5d 20 26 26  (i=0; zUri[i] &&
5c20: 20 7a 55 72 69 5b 69 5d 3e 3d 27 61 27 20 26 26   zUri[i]>='a' &&
5c30: 20 7a 55 72 69 5b 69 5d 3c 3d 27 7a 27 3b 20 69   zUri[i]<='z'; i
5c40: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 55 72 69  ++){}.  if( zUri
5c50: 5b 69 5d 21 3d 27 3a 27 20 29 7b 0a 20 20 20 20  [i]!=':' ){.    
5c60: 62 6c 6f 62 5f 7a 65 72 6f 28 70 53 63 68 65 6d  blob_zero(pSchem
5c70: 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72  e);.    blob_zer
5c80: 6f 28 70 48 6f 73 74 29 3b 0a 20 20 20 20 62 6c  o(pHost);.    bl
5c90: 6f 62 5f 73 65 74 28 70 50 61 74 68 2c 20 7a 55  ob_set(pPath, zU
5ca0: 72 69 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ri);.    return;
5cb0: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 69 6e 69 74  .  }.  blob_init
5cc0: 28 70 53 63 68 65 6d 65 2c 20 7a 55 72 69 2c 20  (pScheme, zUri, 
5cd0: 69 29 3b 0a 20 20 69 2b 2b 3b 0a 20 20 69 66 28  i);.  i++;.  if(
5ce0: 20 7a 55 72 69 5b 69 5d 3d 3d 27 2f 27 20 26 26   zUri[i]=='/' &&
5cf0: 20 7a 55 72 69 5b 69 2b 31 5d 3d 3d 27 2f 27 20   zUri[i+1]=='/' 
5d00: 29 7b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20  ){.    i += 2;. 
5d10: 20 20 20 6a 20 3d 20 69 3b 0a 20 20 20 20 77 68     j = i;.    wh
5d20: 69 6c 65 28 20 7a 55 72 69 5b 69 5d 20 26 26 20  ile( zUri[i] && 
5d30: 7a 55 72 69 5b 69 5d 21 3d 27 2f 27 20 26 26 20  zUri[i]!='/' && 
5d40: 7a 55 72 69 5b 69 5d 21 3d 27 3a 27 20 29 7b 20  zUri[i]!=':' ){ 
5d50: 69 2b 2b 3b 20 7d 0a 20 20 20 20 62 6c 6f 62 5f  i++; }.    blob_
5d60: 69 6e 69 74 28 70 48 6f 73 74 2c 20 26 7a 55 72  init(pHost, &zUr
5d70: 69 5b 6a 5d 2c 20 69 2d 6a 29 3b 0a 20 20 20 20  i[j], i-j);.    
5d80: 69 66 28 20 7a 55 72 69 5b 69 5d 3d 3d 27 3a 27  if( zUri[i]==':'
5d90: 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
5da0: 20 20 20 20 20 2a 70 50 6f 72 74 20 3d 20 61 74       *pPort = at
5db0: 6f 69 28 26 7a 55 72 69 5b 69 5d 29 3b 0a 20 20  oi(&zUri[i]);.  
5dc0: 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
5dd0: 69 5d 20 26 26 20 7a 55 72 69 5b 69 5d 21 3d 27  i] && zUri[i]!='
5de0: 2f 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  /' ){ i++; }.   
5df0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5e00: 62 6c 6f 62 5f 7a 65 72 6f 28 70 48 6f 73 74 29  blob_zero(pHost)
5e10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 55 72 69  ;.  }.  if( zUri
5e20: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
5e30: 62 6c 6f 62 5f 73 65 74 28 70 50 61 74 68 2c 20  blob_set(pPath, 
5e40: 26 7a 55 72 69 5b 69 5d 29 3b 0a 20 20 7d 65 6c  &zUri[i]);.  }el
5e50: 73 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 73 65 74  se{.    blob_set
5e60: 28 70 50 61 74 68 2c 20 22 2f 22 29 3b 0a 20 20  (pPath, "/");.  
5e70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
5e80: 72 75 63 74 20 61 20 72 61 6e 64 6f 6d 20 74 65  ruct a random te
5e90: 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
5ea0: 20 69 6e 74 6f 20 7a 42 75 66 5b 5d 2e 0a 2a 2f   into zBuf[]..*/
5eb0: 0a 76 6f 69 64 20 66 69 6c 65 5f 74 65 6d 70 6e  .void file_tempn
5ec0: 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
5ed0: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
5ee0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5ef0: 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 23 69 66  azDirs[] = {.#if
5f00: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
5f10: 0a 20 20 20 20 20 30 2c 20 2f 2a 20 47 65 74 54  .     0, /* GetT
5f20: 65 6d 70 50 61 74 68 20 2a 2f 0a 20 20 20 20 20  empPath */.     
5f30: 30 2c 20 2f 2a 20 54 45 4d 50 20 2a 2f 0a 20 20  0, /* TEMP */.  
5f40: 20 20 20 30 2c 20 2f 2a 20 54 4d 50 20 2a 2f 0a     0, /* TMP */.
5f50: 23 65 6c 73 65 0a 20 20 20 20 20 22 2f 76 61 72  #else.     "/var
5f60: 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
5f70: 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
5f80: 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 65 6d 70  mp",.     "/temp
5f90: 22 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 22  ",.#endif.     "
5fa0: 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  .",.  };.  stati
5fb0: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
5fc0: 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
5fd0: 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
5fe0: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
5ff0: 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
6000: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
6010: 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
6020: 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  89";.  unsigned 
6030: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73  int i, j;.  cons
6040: 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 22  t char *zDir = "
6050: 2e 22 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .";.  int cnt = 
6060: 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
6070: 5f 57 49 4e 33 32 29 0a 20 20 77 63 68 61 72 5f  _WIN32).  wchar_
6080: 74 20 7a 54 6d 70 50 61 74 68 5b 4d 41 58 5f 50  t zTmpPath[MAX_P
6090: 41 54 48 5d 3b 0a 0a 20 20 69 66 28 20 47 65 74  ATH];..  if( Get
60a0: 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41  TempPathW(MAX_PA
60b0: 54 48 2c 20 7a 54 6d 70 50 61 74 68 29 20 29 7b  TH, zTmpPath) ){
60c0: 0a 20 20 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d  .    azDirs[0] =
60d0: 20 66 6f 73 73 69 6c 5f 75 6e 69 63 6f 64 65 5f   fossil_unicode_
60e0: 74 6f 5f 75 74 66 38 28 7a 54 6d 70 50 61 74 68  to_utf8(zTmpPath
60f0: 29 3b 0a 20 20 7d 0a 0a 20 20 61 7a 44 69 72 73  );.  }..  azDirs
6100: 5b 31 5d 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74  [1] = fossil_get
6110: 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 61  env("TEMP");.  a
6120: 7a 44 69 72 73 5b 32 5d 20 3d 20 66 6f 73 73 69  zDirs[2] = fossi
6130: 6c 5f 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b  l_getenv("TMP");
6140: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 66 6f 72 28  .#endif...  for(
6150: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
6160: 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
6170: 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  irs[0]); i++){. 
6180: 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69 5d     if( azDirs[i]
6190: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
61a0: 20 20 20 20 69 66 28 20 21 66 69 6c 65 5f 69 73      if( !file_is
61b0: 64 69 72 28 61 7a 44 69 72 73 5b 69 5d 29 20 29  dir(azDirs[i]) )
61c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
61d0: 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b  Dir = azDirs[i];
61e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
61f0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
6200: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
6210: 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
6220: 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
6230: 72 61 72 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e  rary file.  ** n
6240: 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
6250: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
6260: 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
6270: 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29  f( (strlen(zDir)
6280: 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f   + 17) >= (size_
6290: 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 66 6f  t)nBuf ){.    fo
62a0: 73 73 69 6c 5f 66 61 74 61 6c 28 22 69 6e 73 75  ssil_fatal("insu
62b0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66  fficient space f
62c0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
62d0: 65 6e 61 6d 65 22 29 3b 0a 20 20 7d 0a 0a 20 20  ename");.  }..  
62e0: 64 6f 7b 0a 20 20 20 20 69 66 28 20 63 6e 74 2b  do{.    if( cnt+
62f0: 2b 3e 32 30 20 29 20 66 6f 73 73 69 6c 5f 70 61  +>20 ) fossil_pa
6300: 6e 69 63 28 22 63 61 6e 6e 6f 74 20 67 65 6e 65  nic("cannot gene
6310: 72 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  rate a temporary
6320: 20 66 69 6c 65 6e 61 6d 65 22 29 3b 0a 20 20 20   filename");.   
6330: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6340: 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c  f(nBuf-17, zBuf,
6350: 20 22 25 73 2f 22 2c 20 7a 44 69 72 29 3b 0a 20   "%s/", zDir);. 
6360: 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
6370: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
6380: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
6390: 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
63a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
63b0: 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
63c0: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
63d0: 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
63e0: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
63f0: 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
6400: 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
6410: 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
6420: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 66 69 6c 65  ;.  }while( file
6430: 5f 73 69 7a 65 28 7a 42 75 66 29 3e 3d 30 20 29  _size(zBuf)>=0 )
6440: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ;..#if defined(_
6450: 57 49 4e 33 32 29 0a 20 20 66 6f 73 73 69 6c 5f  WIN32).  fossil_
6460: 6d 62 63 73 5f 66 72 65 65 28 28 63 68 61 72 20  mbcs_free((char 
6470: 2a 29 61 7a 44 69 72 73 5b 31 5d 29 3b 0a 20 20  *)azDirs[1]);.  
6480: 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65 65  fossil_mbcs_free
6490: 28 28 63 68 61 72 20 2a 29 61 7a 44 69 72 73 5b  ((char *)azDirs[
64a0: 32 5d 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  2]);.#endif.}...
64b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
64c0: 65 20 69 66 20 61 20 66 69 6c 65 20 6e 61 6d 65  e if a file name
64d0: 64 20 7a 4e 61 6d 65 20 65 78 69 73 74 73 20 61  d zName exists a
64e0: 6e 64 20 68 61 73 20 69 64 65 6e 74 69 63 61 6c  nd has identical
64f0: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 74   content.** to t
6500: 68 65 20 62 6c 6f 62 20 70 43 6f 6e 74 65 6e 74  he blob pContent
6510: 2e 20 20 49 66 20 7a 4e 61 6d 65 20 64 6f 65 73  .  If zName does
6520: 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 66   not exist or if
6530: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 0a   the content is.
6540: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 69 6e 20  ** different in 
6550: 61 6e 79 20 77 61 79 2c 20 74 68 65 6e 20 72 65  any way, then re
6560: 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69  turn false..*/.i
6570: 6e 74 20 66 69 6c 65 5f 69 73 5f 74 68 65 5f 73  nt file_is_the_s
6580: 61 6d 65 28 42 6c 6f 62 20 2a 70 43 6f 6e 74 65  ame(Blob *pConte
6590: 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  nt, const char *
65a0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 36 34 20 69 53  zName){.  i64 iS
65b0: 69 7a 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ize;.  int rc;. 
65c0: 20 42 6c 6f 62 20 6f 6e 44 69 73 6b 3b 0a 0a 20   Blob onDisk;.. 
65d0: 20 69 53 69 7a 65 20 3d 20 66 69 6c 65 5f 77 64   iSize = file_wd
65e0: 5f 73 69 7a 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _size(zName);.  
65f0: 69 66 28 20 69 53 69 7a 65 3c 30 20 29 20 72 65  if( iSize<0 ) re
6600: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 53  turn 0;.  if( iS
6610: 69 7a 65 21 3d 62 6c 6f 62 5f 73 69 7a 65 28 70  ize!=blob_size(p
6620: 43 6f 6e 74 65 6e 74 29 20 29 20 72 65 74 75 72  Content) ) retur
6630: 6e 20 30 3b 0a 20 20 69 66 28 20 66 69 6c 65 5f  n 0;.  if( file_
6640: 77 64 5f 69 73 6c 69 6e 6b 28 7a 4e 61 6d 65 29  wd_islink(zName)
6650: 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 61   ){.    blob_rea
6660: 64 5f 6c 69 6e 6b 28 26 6f 6e 44 69 73 6b 2c 20  d_link(&onDisk, 
6670: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
6680: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66  .    blob_read_f
6690: 72 6f 6d 5f 66 69 6c 65 28 26 6f 6e 44 69 73 6b  rom_file(&onDisk
66a0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , zName);.  }.  
66b0: 72 63 20 3d 20 62 6c 6f 62 5f 63 6f 6d 70 61 72  rc = blob_compar
66c0: 65 28 26 6f 6e 44 69 73 6b 2c 20 70 43 6f 6e 74  e(&onDisk, pCont
66d0: 65 6e 74 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73  ent);.  blob_res
66e0: 65 74 28 26 6f 6e 44 69 73 6b 29 3b 0a 20 20 72  et(&onDisk);.  r
66f0: 65 74 75 72 6e 20 72 63 3d 3d 30 3b 0a 7d 0a 0a  eturn rc==0;.}..
6700: 2f 2a 0a 2a 2a 20 50 6f 72 74 61 62 6c 65 20 75  /*.** Portable u
6710: 6e 69 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74  nicode implement
6720: 61 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 64 69 72  ation of opendir
6730: 28 29 0a 2a 2f 0a 23 69 66 20 49 4e 54 45 52 46  ().*/.#if INTERF
6740: 41 43 45 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 64  ACE..#include <d
6750: 69 72 65 6e 74 2e 68 3e 0a 23 69 66 20 64 65 66  irent.h>.#if def
6760: 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 23 20 64  ined(_WIN32).# d
6770: 65 66 69 6e 65 20 44 49 52 20 5f 57 44 49 52 0a  efine DIR _WDIR.
6780: 23 20 64 65 66 69 6e 65 20 64 69 72 65 6e 74 20  # define dirent 
6790: 5f 77 64 69 72 65 6e 74 0a 23 20 64 65 66 69 6e  _wdirent.# defin
67a0: 65 20 6f 70 65 6e 64 69 72 20 5f 77 6f 70 65 6e  e opendir _wopen
67b0: 64 69 72 0a 23 20 64 65 66 69 6e 65 20 72 65 61  dir.# define rea
67c0: 64 64 69 72 20 5f 77 72 65 61 64 64 69 72 0a 23  ddir _wreaddir.#
67d0: 20 64 65 66 69 6e 65 20 63 6c 6f 73 65 64 69 72   define closedir
67e0: 20 5f 77 63 6c 6f 73 65 64 69 72 0a 23 65 6e 64   _wclosedir.#end
67f0: 69 66 20 2f 2a 20 5f 57 49 4e 33 32 20 2a 2f 0a  if /* _WIN32 */.
6800: 0a 23 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52  .#endif /* INTER
6810: 46 41 43 45 20 2a 2f 0a 0a 0a 0a 2f 2a 2a 2a 2a  FACE */..../****
6820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6860: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ******.** The fo
6870: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
6880: 20 74 72 61 6e 73 6c 61 74 65 20 62 65 74 77 65   translate betwe
6890: 65 6e 20 4d 42 43 53 20 61 6e 64 20 55 54 46 38  en MBCS and UTF8
68a0: 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2a 20   on windows..** 
68b0: 53 69 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67  Since everything
68c0: 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20   is always UTF8 
68d0: 6f 6e 20 75 6e 69 78 2c 20 74 68 65 73 65 20 72  on unix, these r
68e0: 6f 75 74 69 6e 65 73 20 61 72 65 20 6e 6f 2d 6f  outines are no-o
68f0: 70 73 0a 2a 2a 20 74 68 65 72 65 2e 0a 2a 2f 0a  ps.** there..*/.
6900: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
6910: 20 4d 42 43 53 20 74 6f 20 55 54 46 38 2e 20 20   MBCS to UTF8.  
6920: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6930: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 6c 61 74   to the translat
6940: 65 64 20 74 65 78 74 2e 0a 2a 2a 20 43 61 6c 6c  ed text..** Call
6950: 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65   fossil_mbcs_fre
6960: 65 28 29 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74  e() to deallocat
6970: 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 75 73 65  e any memory use
6980: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 2a  d to store the.*
6990: 2a 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  * returned point
69a0: 65 72 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a 2f  er when done..*/
69b0: 0a 63 68 61 72 20 2a 66 6f 73 73 69 6c 5f 6d 62  .char *fossil_mb
69c0: 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74  cs_to_utf8(const
69d0: 20 63 68 61 72 20 2a 7a 4d 62 63 73 29 7b 0a 23   char *zMbcs){.#
69e0: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 65  ifdef _WIN32.  e
69f0: 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69  xtern char *sqli
6a00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
6a10: 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61  o_utf8(const cha
6a20: 72 2a 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  r*);.  return sq
6a30: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
6a40: 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 29 3b  _to_utf8(zMbcs);
6a50: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
6a60: 28 63 68 61 72 2a 29 7a 4d 62 63 73 3b 20 20 2f  (char*)zMbcs;  /
6a70: 2a 20 4e 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78 20  * No-op on unix 
6a80: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  */.#endif.}../*.
6a90: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 55 6e 69  ** Translate Uni
6aa0: 63 6f 64 65 20 74 6f 20 55 54 46 38 2e 20 20 52  code to UTF8.  R
6ab0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6ac0: 74 6f 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65  to the translate
6ad0: 64 20 74 65 78 74 2e 0a 2a 2a 20 43 61 6c 6c 20  d text..** Call 
6ae0: 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65 65  fossil_mbcs_free
6af0: 28 29 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65  () to deallocate
6b00: 20 61 6e 79 20 6d 65 6d 6f 72 79 20 75 73 65 64   any memory used
6b10: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a   to store the.**
6b20: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
6b30: 72 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a 2a 0a  r when done..**.
6b40: 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 63  ** On Windows, c
6b50: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
6b60: 20 72 61 6e 67 65 20 55 2b 46 46 30 31 20 74 6f   range U+FF01 to
6b70: 20 55 2b 46 46 37 46 20 28 70 72 69 76 61 74 65   U+FF7F (private
6b80: 20 75 73 65 20 61 72 65 61 29 0a 2a 2a 20 61 72   use area).** ar
6b90: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 20  e translated in 
6ba0: 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73  ASCII characters
6bb0: 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 55 2b   in the range U+
6bc0: 30 30 30 31 20 2d 20 55 2b 30 30 37 46 2e 20 54  0001 - U+007F. T
6bd0: 68 65 0a 2a 2a 20 6f 6e 6c 79 20 70 6c 61 63 65  he.** only place
6be0: 20 74 68 65 79 20 63 61 6e 20 63 6f 6d 65 20 66   they can come f
6bf0: 72 6f 6d 20 61 72 65 20 66 69 6c 65 6e 61 6d 65  rom are filename
6c00: 73 20 75 73 69 6e 67 20 43 79 67 77 69 6e 27 73  s using Cygwin's
6c10: 20 74 72 69 63 6b 0a 2a 2a 20 74 6f 20 63 69 72   trick.** to cir
6c20: 63 75 6d 76 65 6e 74 20 69 6e 76 61 6c 69 64 20  cumvent invalid 
6c30: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 69  characters in fi
6c40: 6c 65 6e 61 6d 65 73 2e 0a 2a 2a 20 53 65 65 3a  lenames..** See:
6c50: 20 3c 68 74 74 70 3a 2f 2f 63 79 67 77 69 6e 2e   <http://cygwin.
6c60: 63 6f 6d 2f 63 79 67 77 69 6e 2d 75 67 2d 6e 65  com/cygwin-ug-ne
6c70: 74 2f 75 73 69 6e 67 2d 73 70 65 63 69 61 6c 6e  t/using-specialn
6c80: 61 6d 65 73 2e 68 74 6d 6c 3e 0a 2a 2a 20 54 68  ames.html>.** Th
6c90: 69 73 20 77 61 79 2c 20 66 6f 73 73 69 6c 20 77  is way, fossil w
6ca0: 69 6c 6c 20 77 6f 72 6b 20 6e 69 63 65 6c 79 20  ill work nicely 
6cb0: 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68  together with th
6cc0: 65 20 63 79 67 77 69 6e 20 73 68 65 6c 6c 0a 2a  e cygwin shell.*
6cd0: 2a 20 68 61 6e 64 6c 69 6e 67 20 74 68 6f 73 65  * handling those
6ce0: 20 66 69 6c 65 6e 61 6d 65 73 2e 20 4f 6e 20 6f   filenames. On o
6cf0: 74 68 65 72 20 73 68 65 6c 6c 73 2c 20 74 68 65  ther shells, the
6d00: 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65 6e   generated filen
6d10: 61 6d 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74  ame.** might not
6d20: 20 62 65 20 61 73 20 65 78 70 65 63 74 65 64 2c   be as expected,
6d30: 20 62 75 74 20 61 70 61 72 74 20 66 72 6f 6d 20   but apart from 
6d40: 74 68 61 74 20 6e 6f 74 68 69 6e 67 20 67 6f 65  that nothing goe
6d50: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 63 68 61 72  s wrong..*/.char
6d60: 20 2a 66 6f 73 73 69 6c 5f 75 6e 69 63 6f 64 65   *fossil_unicode
6d70: 5f 74 6f 5f 75 74 66 38 28 76 6f 69 64 20 2a 7a  _to_utf8(void *z
6d80: 55 6e 69 63 6f 64 65 29 7b 0a 23 69 66 64 65 66  Unicode){.#ifdef
6d90: 20 5f 57 49 4e 33 32 0a 20 20 69 6e 74 20 6e 42   _WIN32.  int nB
6da0: 79 74 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  yte = 0;.  char 
6db0: 2a 7a 55 74 66 3b 0a 20 20 57 43 48 41 52 20 2a  *zUtf;.  WCHAR *
6dc0: 77 55 6e 69 63 6f 64 65 20 3d 20 7a 55 6e 69 63  wUnicode = zUnic
6dd0: 6f 64 65 3b 0a 20 20 77 68 69 6c 65 28 20 2a 77  ode;.  while( *w
6de0: 55 6e 69 63 6f 64 65 20 21 3d 20 30 20 29 7b 0a  Unicode != 0 ){.
6df0: 20 20 20 20 69 66 20 28 20 28 2a 77 55 6e 69 63      if ( (*wUnic
6e00: 6f 64 65 20 3e 20 30 78 46 30 30 30 29 20 26 26  ode > 0xF000) &&
6e10: 20 28 2a 77 55 6e 69 63 6f 64 65 20 3c 3d 20 30   (*wUnicode <= 0
6e20: 78 46 30 37 46 29 20 29 7b 0a 20 20 20 20 20 20  xF07F) ){.      
6e30: 2a 77 55 6e 69 63 6f 64 65 20 26 3d 20 30 78 37  *wUnicode &= 0x7
6e40: 46 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2b 2b 77  F;.    }.    ++w
6e50: 55 6e 69 63 6f 64 65 3b 0a 20 20 7d 0a 20 20 6e  Unicode;.  }.  n
6e60: 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54  Byte = WideCharT
6e70: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
6e80: 46 38 2c 20 30 2c 20 7a 55 6e 69 63 6f 64 65 2c  F8, 0, zUnicode,
6e90: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
6ea0: 3b 0a 20 20 7a 55 74 66 20 3d 20 73 71 6c 69 74  ;.  zUtf = sqlit
6eb0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
6ec0: 20 29 3b 0a 20 20 69 66 28 20 7a 55 74 66 3d 3d   );.  if( zUtf==
6ed0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6ee0: 30 3b 0a 20 20 7d 0a 20 20 57 69 64 65 43 68 61  0;.  }.  WideCha
6ef0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
6f00: 55 54 46 38 2c 20 30 2c 20 7a 55 6e 69 63 6f 64  UTF8, 0, zUnicod
6f10: 65 2c 20 2d 31 2c 20 7a 55 74 66 2c 20 6e 42 79  e, -1, zUtf, nBy
6f20: 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  te, 0, 0);.  ret
6f30: 75 72 6e 20 7a 55 74 66 3b 0a 23 65 6c 73 65 0a  urn zUtf;.#else.
6f40: 20 20 72 65 74 75 72 6e 20 28 63 68 61 72 20 2a    return (char *
6f50: 29 7a 55 6e 69 63 6f 64 65 3b 20 20 2f 2a 20 4e  )zUnicode;  /* N
6f60: 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78 20 2a 2f 0a  o-op on unix */.
6f70: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
6f80: 54 72 61 6e 73 6c 61 74 65 20 55 54 46 38 20 74  Translate UTF8 t
6f90: 6f 20 4d 42 43 53 20 66 6f 72 20 75 73 65 20 69  o MBCS for use i
6fa0: 6e 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 20  n system calls. 
6fb0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6fc0: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74 72 61 6e  r to the.** tran
6fd0: 73 6c 61 74 65 64 20 74 65 78 74 2e 2e 20 20 43  slated text..  C
6fe0: 61 6c 6c 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f  all fossil_mbcs_
6ff0: 66 72 65 65 28 29 20 74 6f 20 64 65 61 6c 6c 6f  free() to deallo
7000: 63 61 74 65 20 61 6e 79 20 6d 65 6d 6f 72 79 0a  cate any memory.
7010: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
7020: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   the returned po
7030: 69 6e 74 65 72 20 77 68 65 6e 20 64 6f 6e 65 2e  inter when done.
7040: 0a 2a 2f 0a 63 68 61 72 20 2a 66 6f 73 73 69 6c  .*/.char *fossil
7050: 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f  _utf8_to_mbcs(co
7060: 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 29  nst char *zUtf8)
7070: 7b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  {.#ifdef _WIN32.
7080: 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73    extern char *s
7090: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
70a0: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
70b0: 63 68 61 72 2a 29 3b 0a 20 20 72 65 74 75 72 6e  char*);.  return
70c0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
70d0: 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 55 74 66  tf8_to_mbcs(zUtf
70e0: 38 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  8);.#else.  retu
70f0: 72 6e 20 28 63 68 61 72 2a 29 7a 55 74 66 38 3b  rn (char*)zUtf8;
7100: 20 20 2f 2a 20 4e 6f 2d 6f 70 20 6f 6e 20 75 6e    /* No-op on un
7110: 69 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ix */.#endif.}..
7120: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
7130: 55 54 46 38 20 74 6f 20 75 6e 69 63 6f 64 65 20  UTF8 to unicode 
7140: 66 6f 72 20 75 73 65 20 69 6e 20 73 79 73 74 65  for use in syste
7150: 6d 20 63 61 6c 6c 73 2e 20 20 52 65 74 75 72 6e  m calls.  Return
7160: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7170: 65 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 64 20  e.** translated 
7180: 74 65 78 74 2e 2e 20 20 43 61 6c 6c 20 66 6f 73  text..  Call fos
7190: 73 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28 29 20  sil_mbcs_free() 
71a0: 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 6e  to deallocate an
71b0: 79 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64  y memory.** used
71c0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
71d0: 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 77  turned pointer w
71e0: 68 65 6e 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  hen done..**.** 
71f0: 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 63 68 61 72  On Windows, char
7200: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 72 61  acters in the ra
7210: 6e 67 65 20 55 2b 30 30 31 20 74 6f 20 55 2b 30  nge U+001 to U+0
7220: 30 33 31 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  031 and the.** c
7230: 68 61 72 61 63 74 65 72 73 20 27 22 27 2c 20 27  haracters '"', '
7240: 2a 27 2c 20 27 3a 27 2c 20 27 3c 27 2c 20 27 3e  *', ':', '<', '>
7250: 27 2c 20 27 3f 27 2c 20 27 7c 27 20 61 6e 64 20  ', '?', '|' and 
7260: 27 5c 5c 27 20 61 72 65 20 69 6e 76 61 6c 69 64  '\\' are invalid
7270: 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 2e 20  .** to be used. 
7280: 54 68 65 72 65 66 6f 72 65 2c 20 74 72 61 6e 73  Therefore, trans
7290: 6c 61 74 65 64 20 74 68 6f 73 65 20 74 6f 20 63  lated those to c
72a0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
72b0: 0a 2a 2a 20 28 70 72 69 76 61 74 65 20 75 73 65  .** (private use
72c0: 20 61 72 65 61 29 2c 20 69 6e 20 74 68 65 20 72   area), in the r
72d0: 61 6e 67 65 20 55 2b 30 30 30 31 20 2d 20 55 2b  ange U+0001 - U+
72e0: 30 30 37 46 2c 20 73 6f 20 74 68 6f 73 65 0a 2a  007F, so those.*
72f0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 76  * characters nev
7300: 65 72 20 61 72 72 69 76 65 20 69 6e 20 61 6e 79  er arrive in any
7310: 20 57 69 6e 64 6f 77 73 20 41 50 49 2e 20 54 68   Windows API. Th
7320: 65 20 66 69 6c 65 6e 61 6d 65 73 20 6d 69 67 68  e filenames migh
7330: 74 0a 2a 2a 20 6c 6f 6f 6b 20 73 74 72 61 6e 67  t.** look strang
7340: 65 20 69 6e 20 57 69 6e 64 6f 77 73 20 65 78 70  e in Windows exp
7350: 6c 6f 72 65 72 2c 20 62 75 74 20 69 6e 20 74 68  lorer, but in th
7360: 65 20 63 79 67 77 69 6e 20 73 68 65 6c 6c 0a 2a  e cygwin shell.*
7370: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 6c 6f 6f  * everything loo
7380: 6b 73 20 61 73 20 65 78 70 65 63 74 65 64 2e 0a  ks as expected..
7390: 2a 2a 0a 2a 2a 20 53 65 65 3a 20 3c 68 74 74 70  **.** See: <http
73a0: 3a 2f 2f 63 79 67 77 69 6e 2e 63 6f 6d 2f 63 79  ://cygwin.com/cy
73b0: 67 77 69 6e 2d 75 67 2d 6e 65 74 2f 75 73 69 6e  gwin-ug-net/usin
73c0: 67 2d 73 70 65 63 69 61 6c 6e 61 6d 65 73 2e 68  g-specialnames.h
73d0: 74 6d 6c 3e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20  tml>.**.*/.void 
73e0: 2a 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f  *fossil_utf8_to_
73f0: 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  unicode(const ch
7400: 61 72 20 2a 7a 55 74 66 38 29 7b 0a 23 69 66 64  ar *zUtf8){.#ifd
7410: 65 66 20 5f 57 49 4e 33 32 0a 20 20 69 6e 74 20  ef _WIN32.  int 
7420: 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74  nByte = MultiByt
7430: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
7440: 54 46 38 2c 20 30 2c 20 7a 55 74 66 38 2c 20 2d  TF8, 0, zUtf8, -
7450: 31 2c 20 30 2c 20 30 29 3b 0a 20 20 77 63 68 61  1, 0, 0);.  wcha
7460: 72 5f 74 20 2a 7a 55 6e 69 63 6f 64 65 20 3d 20  r_t *zUnicode = 
7470: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
7480: 6e 42 79 74 65 20 2a 20 32 20 29 3b 0a 20 20 77  nByte * 2 );.  w
7490: 63 68 61 72 5f 74 20 2a 77 55 6e 69 63 6f 64 65  char_t *wUnicode
74a0: 3b 0a 20 20 69 66 28 20 7a 55 6e 69 63 6f 64 65  ;.  if( zUnicode
74b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
74c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 4d 75 6c 74 69  n 0;.  }.  Multi
74d0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
74e0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 55 74 66 38  P_UTF8, 0, zUtf8
74f0: 2c 20 2d 31 2c 20 7a 55 6e 69 63 6f 64 65 2c 20  , -1, zUnicode, 
7500: 6e 42 79 74 65 29 3b 0a 20 20 77 55 6e 69 63 6f  nByte);.  wUnico
7510: 64 65 20 3d 20 7a 55 6e 69 63 6f 64 65 3b 0a 20  de = zUnicode;. 
7520: 20 77 68 69 6c 65 28 20 2d 2d 6e 42 79 74 65 20   while( --nByte 
7530: 3e 20 30 29 7b 0a 20 20 20 20 69 66 20 28 20 28  > 0){.    if ( (
7540: 2a 77 55 6e 69 63 6f 64 65 20 3c 20 33 32 29 20  *wUnicode < 32) 
7550: 7c 7c 20 77 63 73 63 68 72 28 4c 22 5c 22 2a 3c  || wcschr(L"\"*<
7560: 3e 3f 7c 22 2c 20 2a 77 55 6e 69 63 6f 64 65 29  >?|", *wUnicode)
7570: 20 29 7b 0a 20 20 20 20 20 20 2a 77 55 6e 69 63   ){.      *wUnic
7580: 6f 64 65 20 7c 3d 20 30 78 46 30 30 30 3b 0a 20  ode |= 0xF000;. 
7590: 20 20 20 7d 0a 20 20 20 20 2b 2b 77 55 6e 69 63     }.    ++wUnic
75a0: 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ode;.  }..  retu
75b0: 72 6e 20 7a 55 6e 69 63 6f 64 65 3b 0a 23 65 6c  rn zUnicode;.#el
75c0: 73 65 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  se.  return (voi
75d0: 64 20 2a 29 7a 55 74 66 38 3b 20 20 2f 2a 20 4e  d *)zUtf8;  /* N
75e0: 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78 20 2a 2f 0a  o-op on unix */.
75f0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
7600: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
7610: 20 6f 66 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65   of an environme
7620: 6e 74 20 76 61 72 69 61 62 6c 65 20 61 73 20 55  nt variable as U
7630: 54 46 38 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 6f  TF8..*/.char *fo
7640: 73 73 69 6c 5f 67 65 74 65 6e 76 28 63 6f 6e 73  ssil_getenv(cons
7650: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
7660: 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20  #ifdef _WIN32.  
7670: 77 63 68 61 72 5f 74 20 2a 75 4e 61 6d 65 20 3d  wchar_t *uName =
7680: 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f   fossil_utf8_to_
7690: 75 6e 69 63 6f 64 65 28 7a 4e 61 6d 65 29 3b 0a  unicode(zName);.
76a0: 20 20 76 6f 69 64 20 2a 7a 56 61 6c 75 65 20 3d    void *zValue =
76b0: 20 5f 77 67 65 74 65 6e 76 28 75 4e 61 6d 65 29   _wgetenv(uName)
76c0: 3b 0a 20 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f  ;.  fossil_mbcs_
76d0: 66 72 65 65 28 75 4e 61 6d 65 29 3b 0a 20 20 69  free(uName);.  i
76e0: 66 28 20 7a 56 61 6c 75 65 20 29 20 7a 56 61 6c  f( zValue ) zVal
76f0: 75 65 20 3d 20 66 6f 73 73 69 6c 5f 75 6e 69 63  ue = fossil_unic
7700: 6f 64 65 5f 74 6f 5f 75 74 66 38 28 7a 56 61 6c  ode_to_utf8(zVal
7710: 75 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61  ue);.#else.  cha
7720: 72 20 2a 7a 56 61 6c 75 65 20 3d 20 67 65 74 65  r *zValue = gete
7730: 6e 76 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nv(zName);.#endi
7740: 66 0a 20 20 72 65 74 75 72 6e 20 7a 56 61 6c 75  f.  return zValu
7750: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  e;.}../*.** Disp
7760: 6c 61 79 20 55 54 46 38 20 6f 6e 20 74 68 65 20  lay UTF8 on the 
7770: 63 6f 6e 73 6f 6c 65 2e 20 20 52 65 74 75 72 6e  console.  Return
7780: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
7790: 2a 20 43 68 61 72 61 63 74 65 72 73 20 77 72 69  * Characters wri
77a0: 74 74 65 6e 2e 20 49 66 20 73 74 64 6f 75 74 20  tten. If stdout 
77b0: 6f 72 20 73 74 64 65 72 72 20 69 73 20 72 65 64  or stderr is red
77c0: 69 72 65 63 74 65 64 0a 2a 2a 20 74 6f 20 61 20  irected.** to a 
77d0: 66 69 6c 65 2c 20 2d 31 20 69 73 20 72 65 74 75  file, -1 is retu
77e0: 72 6e 65 64 20 61 6e 64 20 6e 6f 74 68 69 6e 67  rned and nothing
77f0: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74   is written.** t
7800: 6f 20 74 68 65 20 63 6f 6e 73 6f 6c 65 2e 0a 2a  o the console..*
7810: 2f 0a 69 6e 74 20 66 6f 73 73 69 6c 5f 75 74 66  /.int fossil_utf
7820: 38 5f 74 6f 5f 63 6f 6e 73 6f 6c 65 28 63 6f 6e  8_to_console(con
7830: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 2c 20  st char *zUtf8, 
7840: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 74  int nByte, int t
7850: 6f 53 74 64 45 72 72 29 7b 0a 23 69 66 64 65 66  oStdErr){.#ifdef
7860: 20 5f 57 49 4e 33 32 0a 20 20 69 6e 74 20 6e 43   _WIN32.  int nC
7870: 68 61 72 3b 0a 20 20 77 63 68 61 72 5f 74 20 2a  har;.  wchar_t *
7880: 7a 55 6e 69 63 6f 64 65 3b 20 2f 2a 20 55 6e 69  zUnicode; /* Uni
7890: 63 6f 64 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  code version of 
78a0: 7a 55 74 66 38 20 2a 2f 0a 20 20 44 57 4f 52 44  zUtf8 */.  DWORD
78b0: 20 64 75 6d 6d 79 3b 0a 0a 20 20 73 74 61 74 69   dummy;..  stati
78c0: 63 20 69 6e 74 20 69 73 74 74 79 5b 32 5d 20 3d  c int istty[2] =
78d0: 20 7b 20 2d 31 2c 20 2d 31 20 7d 3b 0a 20 20 69   { -1, -1 };.  i
78e0: 66 28 20 69 73 74 74 79 5b 74 6f 53 74 64 45 72  f( istty[toStdEr
78f0: 72 5d 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  r] == -1 ){.    
7900: 69 73 74 74 79 5b 74 6f 53 74 64 45 72 72 5d 20  istty[toStdErr] 
7910: 3d 20 5f 69 73 61 74 74 79 28 74 6f 53 74 64 45  = _isatty(toStdE
7920: 72 72 20 2b 20 31 29 20 21 3d 20 30 3b 0a 20 20  rr + 1) != 0;.  
7930: 7d 0a 20 20 69 66 28 20 21 69 73 74 74 79 5b 74  }.  if( !istty[t
7940: 6f 53 74 64 45 72 72 5d 20 29 7b 0a 20 20 20 20  oStdErr] ){.    
7950: 2f 2a 20 73 74 64 6f 75 74 2f 73 74 64 65 72 72  /* stdout/stderr
7960: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 6f 6c   is not a consol
7970: 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  e. */.    return
7980: 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 6e 43 68 61   -1;.  }..  nCha
7990: 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57  r = MultiByteToW
79a0: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
79b0: 20 30 2c 20 7a 55 74 66 38 2c 20 6e 42 79 74 65   0, zUtf8, nByte
79c0: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 55  , NULL, 0);.  zU
79d0: 6e 69 63 6f 64 65 20 3d 20 6d 61 6c 6c 6f 63 28  nicode = malloc(
79e0: 20 28 6e 43 68 61 72 20 2b 20 31 29 20 2a 73 69   (nChar + 1) *si
79f0: 7a 65 6f 66 28 7a 55 6e 69 63 6f 64 65 5b 30 5d  zeof(zUnicode[0]
7a00: 29 20 29 3b 0a 20 20 69 66 28 20 7a 55 6e 69 63  ) );.  if( zUnic
7a10: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ode==0 ){.    re
7a20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
7a30: 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54  har = MultiByteT
7a40: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
7a50: 38 2c 20 30 2c 20 7a 55 74 66 38 2c 20 6e 42 79  8, 0, zUtf8, nBy
7a60: 74 65 2c 20 7a 55 6e 69 63 6f 64 65 2c 20 6e 43  te, zUnicode, nC
7a70: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
7a80: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65  r==0 ){.    free
7a90: 28 7a 55 6e 69 63 6f 64 65 29 3b 0a 20 20 20 20  (zUnicode);.    
7aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7ab0: 7a 55 6e 69 63 6f 64 65 5b 6e 43 68 61 72 5d 20  zUnicode[nChar] 
7ac0: 3d 20 27 5c 30 27 3b 0a 20 20 57 72 69 74 65 43  = '\0';.  WriteC
7ad0: 6f 6e 73 6f 6c 65 57 28 47 65 74 53 74 64 48 61  onsoleW(GetStdHa
7ae0: 6e 64 6c 65 28 53 54 44 5f 4f 55 54 50 55 54 5f  ndle(STD_OUTPUT_
7af0: 48 41 4e 44 4c 45 20 2d 20 74 6f 53 74 64 45 72  HANDLE - toStdEr
7b00: 72 29 2c 20 7a 55 6e 69 63 6f 64 65 2c 20 6e 43  r), zUnicode, nC
7b10: 68 61 72 2c 20 26 64 75 6d 6d 79 2c 20 30 29 3b  har, &dummy, 0);
7b20: 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b  .  return nChar;
7b30: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
7b40: 2d 31 3b 20 20 2f 2a 20 4e 6f 2d 6f 70 20 6f 6e  -1;  /* No-op on
7b50: 20 75 6e 69 78 20 2a 2f 0a 23 65 6e 64 69 66 0a   unix */.#endif.
7b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
7b70: 74 65 20 4d 42 43 53 20 74 6f 20 55 54 46 38 2e  te MBCS to UTF8.
7b80: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
7b90: 65 72 2e 20 20 43 61 6c 6c 20 66 6f 73 73 69 6c  er.  Call fossil
7ba0: 5f 6d 62 63 73 5f 66 72 65 65 28 29 0a 2a 2a 20  _mbcs_free().** 
7bb0: 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 6e  to deallocate an
7bc0: 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f  y memory used to
7bd0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 74 75 72   store the retur
7be0: 6e 65 64 20 70 6f 69 6e 74 65 72 20 77 68 65 6e  ned pointer when
7bf0: 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 66   done..*/.void f
7c00: 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28  ossil_mbcs_free(
7c10: 76 6f 69 64 20 2a 7a 4f 6c 64 29 7b 0a 23 69 66  void *zOld){.#if
7c20: 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 65 78 74  def _WIN32.  ext
7c30: 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 33  ern void sqlite3
7c40: 5f 66 72 65 65 28 76 6f 69 64 2a 29 3b 0a 20 20  _free(void*);.  
7c50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c  sqlite3_free(zOl
7c60: 64 29 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  d);.#else.  /* N
7c70: 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78 20 2a 2f 0a  o-op on unix */.
7c80: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
7c90: 4c 69 6b 65 20 66 6f 70 65 6e 28 29 20 62 75 74  Like fopen() but
7ca0: 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 61 20   always takes a 
7cb0: 55 54 46 38 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  UTF8 argument..*
7cc0: 2f 0a 46 49 4c 45 20 2a 66 6f 73 73 69 6c 5f 66  /.FILE *fossil_f
7cd0: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
7ce0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
7cf0: 61 72 20 2a 7a 4d 6f 64 65 29 7b 0a 23 69 66 64  ar *zMode){.#ifd
7d00: 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61  ef _WIN32.  wcha
7d10: 72 5f 74 20 2a 75 4d 6f 64 65 20 3d 20 66 6f 73  r_t *uMode = fos
7d20: 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  sil_utf8_to_unic
7d30: 6f 64 65 28 7a 4d 6f 64 65 29 3b 0a 20 20 77 63  ode(zMode);.  wc
7d40: 68 61 72 5f 74 20 2a 75 4e 61 6d 65 20 3d 20 66  har_t *uName = f
7d50: 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e  ossil_utf8_to_un
7d60: 69 63 6f 64 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  icode(zName);.  
7d70: 46 49 4c 45 20 2a 66 20 3d 20 5f 77 66 6f 70 65  FILE *f = _wfope
7d80: 6e 28 75 4e 61 6d 65 2c 20 75 4d 6f 64 65 29 3b  n(uName, uMode);
7d90: 0a 20 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66  .  fossil_mbcs_f
7da0: 72 65 65 28 75 4e 61 6d 65 29 3b 0a 20 20 66 6f  ree(uName);.  fo
7db0: 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28 75  ssil_mbcs_free(u
7dc0: 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 46  Mode);.#else.  F
7dd0: 49 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a  ILE *f = fopen(z
7de0: 4e 61 6d 65 2c 20 7a 4d 6f 64 65 29 3b 0a 23 65  Name, zMode);.#e
7df0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 66 3b  ndif.  return f;
7e00: 0a 7d 0a                                         .}.