Not logged in
Changes On Branch mistake

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch mistake Excluding Merge-Ins

This is equivalent to a diff from a9235f4cc4 to cdfde813f9

2014-04-29
10:19
Fix some compiler warnings 'may be uninitialized in this function'. Move path conversions out of win32_chdir/win32_access/win32_stat, as its caller already can do that. This eliminates some code duplication. check-in: 503482a2c6 user: jan.nijtmans tags: trunk
09:26
Fix some compiler warnings 'may be uninitialized in this function'. Move path conversions out of win32_chdir/win32_access/win32_stat, as its caller already can do that. This eliminates some code duplication. Closed-Leaf check-in: cdfde813f9 user: jan.nijtmans tags: mistake
07:15
merge trunk check-in: 791cebc129 user: jan.nijtmans tags: cleanX
00:31
Set the mtime column of the USER table on a self-registration. check-in: a9235f4cc4 user: drh tags: trunk
2014-04-28
12:24
Remove unneeded variable: Since could_be_utf16() calls starts_with_utf16_bom() it can be deduced that for Unicode text, bRevUnicode always has the same value as bRevUtf16. The comments on the variables already suggested that. check-in: 09f2386328 user: jan.nijtmans tags: trunk

Changes to src/file.c.
77
78
79
80
81
82
83
84
85
86


87
88
89
90
91
92
93
94
95

96


97
98
99
100
101
102
103
77
78
79
80
81
82
83

84

85
86
87
88
89
90
91


92

93
94
95
96
97
98
99
100
101
102
103







-

-
+
+





-
-

-
+

+
+








/*
** Fill stat buf with information received from stat() or lstat().
** lstat() is called on Unix if isWd is TRUE and allow-symlinks setting is on.
**
*/
static int fossil_stat(const char *zFilename, struct fossilStat *buf, int isWd){
#if !defined(_WIN32)
  int rc;
  char *zMbcs = fossil_utf8_to_filename(zFilename);
  void *zMbcs = fossil_utf8_to_filename(zFilename);
#if !defined(_WIN32)
  if( isWd && g.allowSymlinks ){
    rc = lstat(zMbcs, buf);
  }else{
    rc = stat(zMbcs, buf);
  }
  fossil_filename_free(zMbcs);
  return rc;
#else
  return win32_stat(zFilename, buf, isWd);
  rc = win32_stat(zMbcs, buf, isWd);
#endif
  fossil_filename_free(zMbcs);
  return rc;
}

/*
** Fill in the fileStat variable for the file named zFilename.
** If zFilename==0, then use the previous value of fileStat if
** there is a previous value.
**
314
315
316
317
318
319
320


321
322

323
324
325


326
327
328
329
330
331
332
333
334
335
336


337
338

339
340
341
342
343
344
345

346
347
348
349
350
351
352
353
354
355
314
315
316
317
318
319
320
321
322
323

324
325


326
327
328
329

330
331
332
333
334
335
336
337
338
339
340

341
342

343
344
345
346
347
348
349
350

351
352
353
354
355
356
357







+
+

-
+

-
-
+
+


-








+
+

-
+

-





+


-







}


/*
** Wrapper around the access() system call.
*/
int file_access(const char *zFilename, int flags){
  int rc;
  void *zMbcs = fossil_utf8_to_filename(zFilename);
#ifdef _WIN32
  return win32_access(zFilename, flags);
  rc = win32_access(zMbcs, flags);
#else
  char *zMbcs = fossil_utf8_to_filename(zFilename);
  int rc = access(zMbcs, flags);
  rc = access(zMbcs, flags);
#endif
  fossil_filename_free(zMbcs);
  return rc;
#endif
}

/*
** Wrapper around the chdir() system call.
** If bChroot=1, do a chroot to this dir as well
** (UNIX only)
*/
int file_chdir(const char *zChDir, int bChroot){
  int rc;
  void *zPath = fossil_utf8_to_filename(zChDir);
#ifdef _WIN32
  return win32_chdir(zChDir, bChroot);
  rc = win32_chdir(zPath, bChroot);
#else
  char *zPath = fossil_utf8_to_filename(zChDir);
  int rc = chdir(zPath);
  if( !rc && bChroot ){
    rc = chroot(zPath);
    if( !rc ) rc = chdir("/");
  }
#endif
  fossil_filename_free(zPath);
  return rc;
#endif
}

/*
** Find an unused filename similar to zBase with zSuffix appended.
**
** Make the name relative to the working directory if relFlag is true.
**
Changes to src/lookslike.c.
369
370
371
372
373
374
375
376
377
378
379
380





381
382
383
384
385
386
387
369
370
371
372
373
374
375





376
377
378
379
380
381
382
383
384
385
386
387







-
-
-
-
-
+
+
+
+
+







**    --utf8           Ignoring BOM and file size, force UTF-8 checking
**    --utf16          Ignoring BOM and file size, force UTF-16 checking
**
** FILENAME is the name of a file to check for textual content in the UTF-8
** and/or UTF-16 encodings.
*/
void looks_like_utf_test_cmd(void){
  Blob blob;     /* the contents of the specified file */
  int fUtf8;     /* return value of starts_with_utf8_bom() */
  int fUtf16;    /* return value of starts_with_utf16_bom() */
  int fUnicode;  /* return value of could_be_utf16() */
  int lookFlags; /* output flags from looks_like_utf8/utf16() */
  Blob blob;         /* the contents of the specified file */
  int fUtf8 = 0;     /* return value of starts_with_utf8_bom() */
  int fUtf16 = 0;    /* return value of starts_with_utf16_bom() */
  int fUnicode = 0;  /* return value of could_be_utf16() */
  int lookFlags = 0; /* output flags from looks_like_utf8/utf16() */
  int bRevUtf16 = 0; /* non-zero -> UTF-16 byte order reversed */
  int fForceUtf8 = find_option("utf8",0,0)!=0;
  int fForceUtf16 = find_option("utf16",0,0)!=0;
  const char *zCount = find_option("limit","n",1);
  int nRepeat = 1;

  if( g.argc!=3 ) usage("FILENAME");
Changes to src/winfile.c.
30
31
32
33
34
35
36
37

38
39
40

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

74
75
76
77
78
79
80
30
31
32
33
34
35
36

37
38


39

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

56
57
58
59
60
61
62
63
64
65
66
67
68
69


70
71
72
73
74
75
76
77







-
+

-
-
+
-
















-
+













-
-
+







#endif

/*
** Fill stat buf with information received from stat() or lstat().
** lstat() is called on Unix if isWd is TRUE and allow-symlinks setting is on.
**
*/
int win32_stat(const char *zFilename, struct fossilStat *buf, int isWd){
int win32_stat(const wchar_t *zFilename, struct fossilStat *buf, int isWd){
  WIN32_FILE_ATTRIBUTE_DATA attr;
  wchar_t *zMbcs = fossil_utf8_to_filename(zFilename);
  int rc = GetFileAttributesExW(zMbcs, GetFileExInfoStandard, &attr);
  int rc = GetFileAttributesExW(zFilename, GetFileExInfoStandard, &attr);
  fossil_filename_free(zMbcs);
  if( rc ){
    ULARGE_INTEGER ull;
    ull.LowPart = attr.ftLastWriteTime.dwLowDateTime;
    ull.HighPart = attr.ftLastWriteTime.dwHighDateTime;
    buf->st_mode = (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ?
                   S_IFDIR : S_IFREG;
    buf->st_size = (((i64)attr.nFileSizeHigh)<<32) | attr.nFileSizeLow;
    buf->st_mtime = ull.QuadPart / 10000000ULL - 11644473600ULL;
  }
  return !rc;
}

/*
** Wrapper around the access() system call.  This code was copied from Tcl
** 8.6 and then modified.
*/
int win32_access(const char *zFilename, int flags){
int win32_access(const wchar_t *zFilename, int flags){
  int rc = 0;
  PSECURITY_DESCRIPTOR pSd = NULL;
  unsigned long size;
  PSID pSid = NULL;
  BOOL sidDefaulted;
  BOOL impersonated = FALSE;
  SID_IDENTIFIER_AUTHORITY unmapped = {{0, 0, 0, 0, 0, 22}};
  GENERIC_MAPPING genMap;
  HANDLE hToken = NULL;
  DWORD desiredAccess = 0, grantedAccess = 0;
  BOOL accessYesNo = FALSE;
  PRIVILEGE_SET privSet;
  DWORD privSetSize = sizeof(PRIVILEGE_SET);
  wchar_t *zMbcs = fossil_utf8_to_filename(zFilename);
  DWORD attr = GetFileAttributesW(zMbcs);
  DWORD attr = GetFileAttributesW(zFilename);

  if( attr==INVALID_FILE_ATTRIBUTES ){
    /*
     * File might not exist.
     */

    if( GetLastError()!=ERROR_SHARING_VIOLATION ){
112
113
114
115
116
117
118
119

120
121
122
123
124
125
126
109
110
111
112
113
114
115

116
117
118
119
120
121
122
123







-
+







   */

  /*
   * First find out how big the buffer needs to be.
   */

  size = 0;
  GetFileSecurityW(zMbcs,
  GetFileSecurityW(zFilename,
      OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
      DACL_SECURITY_INFORMATION | LABEL_SECURITY_INFORMATION,
      0, 0, &size);

  /*
   * Should have failed with ERROR_INSUFFICIENT_BUFFER
   */
144
145
146
147
148
149
150
151

152
153
154
155
156
157
158
141
142
143
144
145
146
147

148
149
150
151
152
153
154
155







-
+







    rc = -1; goto done;
  }

  /*
   * Call GetFileSecurity() for real.
   */

  if( !GetFileSecurityW(zMbcs,
  if( !GetFileSecurityW(zFilename,
          OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
          DACL_SECURITY_INFORMATION | LABEL_SECURITY_INFORMATION,
          pSd, size, &size) ){
    /*
     * Error getting owner SD
     */

241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257

258
259

260
261
262
263
264
265
266
267
238
239
240
241
242
243
244

245
246
247
248
249


250

251


252

253
254
255
256
257
258
259







-





-
-

-
+
-
-
+
-







  if( impersonated ){
    RevertToSelf();
    impersonated = FALSE;
  }
  if( pSd!=NULL ){
    HeapFree(GetProcessHeap(), 0, pSd);
  }
  fossil_filename_free(zMbcs);
  return rc;
}

/*
** Wrapper around the chdir() system call.
** If bChroot=1, do a chroot to this dir as well
** (UNIX only)
*/
int win32_chdir(const char *zChDir, int bChroot){
int win32_chdir(const void *zChDir, int bChroot){
  wchar_t *zPath = fossil_utf8_to_filename(zChDir);
  int rc = (int)!SetCurrentDirectoryW(zPath);
  int rc = (int)!SetCurrentDirectoryW(zChDir);
  fossil_filename_free(zPath);
  return rc;
}

/*
** Get the current working directory.
**
** On windows, the name is converted from unicode to UTF8 and all '\\'