| OLD | NEW |
| 1 /* | 1 /* |
| 2 ** 2004 May 22 | 2 ** 2004 May 22 |
| 3 ** | 3 ** |
| 4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
| 5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
| 6 ** | 6 ** |
| 7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
| 8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
| 9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
| 10 ** | 10 ** |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 ** where the database is located. | 64 ** where the database is located. |
| 65 */ | 65 */ |
| 66 #if !defined(SQLITE_ENABLE_LOCKING_STYLE) | 66 #if !defined(SQLITE_ENABLE_LOCKING_STYLE) |
| 67 # if defined(__APPLE__) | 67 # if defined(__APPLE__) |
| 68 # define SQLITE_ENABLE_LOCKING_STYLE 1 | 68 # define SQLITE_ENABLE_LOCKING_STYLE 1 |
| 69 # else | 69 # else |
| 70 # define SQLITE_ENABLE_LOCKING_STYLE 0 | 70 # define SQLITE_ENABLE_LOCKING_STYLE 0 |
| 71 # endif | 71 # endif |
| 72 #endif | 72 #endif |
| 73 | 73 |
| 74 /* Use pread() and pwrite() if they are available */ |
| 75 #if defined(__APPLE__) |
| 76 # define HAVE_PREAD 1 |
| 77 # define HAVE_PWRITE 1 |
| 78 #endif |
| 79 #if defined(HAVE_PREAD64) && defined(HAVE_PWRITE64) |
| 80 # undef USE_PREAD |
| 81 # define USE_PREAD64 1 |
| 82 #elif defined(HAVE_PREAD) && defined(HAVE_PWRITE) |
| 83 # undef USE_PREAD64 |
| 84 # define USE_PREAD 1 |
| 85 #endif |
| 86 |
| 74 /* | 87 /* |
| 75 ** standard include files. | 88 ** standard include files. |
| 76 */ | 89 */ |
| 77 #include <sys/types.h> | 90 #include <sys/types.h> |
| 78 #include <sys/stat.h> | 91 #include <sys/stat.h> |
| 79 #include <fcntl.h> | 92 #include <fcntl.h> |
| 80 #include <unistd.h> | 93 #include <unistd.h> |
| 81 #include <time.h> | 94 #include <time.h> |
| 82 #include <sys/time.h> | 95 #include <sys/time.h> |
| 83 #include <errno.h> | 96 #include <errno.h> |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 */ | 155 */ |
| 143 #ifndef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS | 156 #ifndef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS |
| 144 # define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755 | 157 # define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755 |
| 145 #endif | 158 #endif |
| 146 | 159 |
| 147 /* | 160 /* |
| 148 ** Maximum supported path-length. | 161 ** Maximum supported path-length. |
| 149 */ | 162 */ |
| 150 #define MAX_PATHNAME 512 | 163 #define MAX_PATHNAME 512 |
| 151 | 164 |
| 165 /* |
| 166 ** Maximum supported symbolic links |
| 167 */ |
| 168 #define SQLITE_MAX_SYMLINKS 100 |
| 169 |
| 152 /* Always cast the getpid() return type for compatibility with | 170 /* Always cast the getpid() return type for compatibility with |
| 153 ** kernel modules in VxWorks. */ | 171 ** kernel modules in VxWorks. */ |
| 154 #define osGetpid(X) (pid_t)getpid() | 172 #define osGetpid(X) (pid_t)getpid() |
| 155 | 173 |
| 156 /* | 174 /* |
| 157 ** Only set the lastErrno if the error code is a real error and not | 175 ** Only set the lastErrno if the error code is a real error and not |
| 158 ** a normal expected return code of SQLITE_BUSY or SQLITE_OK | 176 ** a normal expected return code of SQLITE_BUSY or SQLITE_OK |
| 159 */ | 177 */ |
| 160 #define IS_LOCK_ERROR(x) ((x != SQLITE_OK) && (x != SQLITE_BUSY)) | 178 #define IS_LOCK_ERROR(x) ((x != SQLITE_OK) && (x != SQLITE_BUSY)) |
| 161 | 179 |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 #else | 398 #else |
| 381 { "pread", (sqlite3_syscall_ptr)0, 0 }, | 399 { "pread", (sqlite3_syscall_ptr)0, 0 }, |
| 382 #endif | 400 #endif |
| 383 #define osPread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].pCurrent) | 401 #define osPread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].pCurrent) |
| 384 | 402 |
| 385 #if defined(USE_PREAD64) | 403 #if defined(USE_PREAD64) |
| 386 { "pread64", (sqlite3_syscall_ptr)pread64, 0 }, | 404 { "pread64", (sqlite3_syscall_ptr)pread64, 0 }, |
| 387 #else | 405 #else |
| 388 { "pread64", (sqlite3_syscall_ptr)0, 0 }, | 406 { "pread64", (sqlite3_syscall_ptr)0, 0 }, |
| 389 #endif | 407 #endif |
| 390 #define osPread64 ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[10].pCurrent) | 408 #define osPread64 ((ssize_t(*)(int,void*,size_t,off64_t))aSyscall[10].pCurrent) |
| 391 | 409 |
| 392 { "write", (sqlite3_syscall_ptr)write, 0 }, | 410 { "write", (sqlite3_syscall_ptr)write, 0 }, |
| 393 #define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) | 411 #define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) |
| 394 | 412 |
| 395 #if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE | 413 #if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE |
| 396 { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 }, | 414 { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 }, |
| 397 #else | 415 #else |
| 398 { "pwrite", (sqlite3_syscall_ptr)0, 0 }, | 416 { "pwrite", (sqlite3_syscall_ptr)0, 0 }, |
| 399 #endif | 417 #endif |
| 400 #define osPwrite ((ssize_t(*)(int,const void*,size_t,off_t))\ | 418 #define osPwrite ((ssize_t(*)(int,const void*,size_t,off_t))\ |
| 401 aSyscall[12].pCurrent) | 419 aSyscall[12].pCurrent) |
| 402 | 420 |
| 403 #if defined(USE_PREAD64) | 421 #if defined(USE_PREAD64) |
| 404 { "pwrite64", (sqlite3_syscall_ptr)pwrite64, 0 }, | 422 { "pwrite64", (sqlite3_syscall_ptr)pwrite64, 0 }, |
| 405 #else | 423 #else |
| 406 { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, | 424 { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, |
| 407 #endif | 425 #endif |
| 408 #define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off_t))\ | 426 #define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off64_t))\ |
| 409 aSyscall[13].pCurrent) | 427 aSyscall[13].pCurrent) |
| 410 | 428 |
| 411 { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, | 429 { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, |
| 412 #define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) | 430 #define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) |
| 413 | 431 |
| 414 #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE | 432 #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE |
| 415 { "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 }, | 433 { "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 }, |
| 416 #else | 434 #else |
| 417 { "fallocate", (sqlite3_syscall_ptr)0, 0 }, | 435 { "fallocate", (sqlite3_syscall_ptr)0, 0 }, |
| 418 #endif | 436 #endif |
| 419 #define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) | 437 #define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) |
| 420 | 438 |
| 421 { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, | 439 { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, |
| 422 #define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) | 440 #define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) |
| 423 | 441 |
| 424 { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, | 442 { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, |
| 425 #define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) | 443 #define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) |
| 426 | 444 |
| 427 { "mkdir", (sqlite3_syscall_ptr)mkdir, 0 }, | 445 { "mkdir", (sqlite3_syscall_ptr)mkdir, 0 }, |
| 428 #define osMkdir ((int(*)(const char*,mode_t))aSyscall[18].pCurrent) | 446 #define osMkdir ((int(*)(const char*,mode_t))aSyscall[18].pCurrent) |
| 429 | 447 |
| 430 { "rmdir", (sqlite3_syscall_ptr)rmdir, 0 }, | 448 { "rmdir", (sqlite3_syscall_ptr)rmdir, 0 }, |
| 431 #define osRmdir ((int(*)(const char*))aSyscall[19].pCurrent) | 449 #define osRmdir ((int(*)(const char*))aSyscall[19].pCurrent) |
| 432 | 450 |
| 451 #if defined(HAVE_FCHOWN) |
| 433 { "fchown", (sqlite3_syscall_ptr)fchown, 0 }, | 452 { "fchown", (sqlite3_syscall_ptr)fchown, 0 }, |
| 453 #else |
| 454 { "fchown", (sqlite3_syscall_ptr)0, 0 }, |
| 455 #endif |
| 434 #define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent) | 456 #define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent) |
| 435 | 457 |
| 436 { "geteuid", (sqlite3_syscall_ptr)geteuid, 0 }, | 458 { "geteuid", (sqlite3_syscall_ptr)geteuid, 0 }, |
| 437 #define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent) | 459 #define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent) |
| 438 | 460 |
| 439 #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 | 461 #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 |
| 440 { "mmap", (sqlite3_syscall_ptr)mmap, 0 }, | 462 { "mmap", (sqlite3_syscall_ptr)mmap, 0 }, |
| 463 #else |
| 464 { "mmap", (sqlite3_syscall_ptr)0, 0 }, |
| 465 #endif |
| 441 #define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[22].pCurrent) | 466 #define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[22].pCurrent) |
| 442 | 467 |
| 468 #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 |
| 443 { "munmap", (sqlite3_syscall_ptr)munmap, 0 }, | 469 { "munmap", (sqlite3_syscall_ptr)munmap, 0 }, |
| 470 #else |
| 471 { "munmap", (sqlite3_syscall_ptr)0, 0 }, |
| 472 #endif |
| 444 #define osMunmap ((void*(*)(void*,size_t))aSyscall[23].pCurrent) | 473 #define osMunmap ((void*(*)(void*,size_t))aSyscall[23].pCurrent) |
| 445 | 474 |
| 446 #if HAVE_MREMAP | 475 #if HAVE_MREMAP && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) |
| 447 { "mremap", (sqlite3_syscall_ptr)mremap, 0 }, | 476 { "mremap", (sqlite3_syscall_ptr)mremap, 0 }, |
| 448 #else | 477 #else |
| 449 { "mremap", (sqlite3_syscall_ptr)0, 0 }, | 478 { "mremap", (sqlite3_syscall_ptr)0, 0 }, |
| 450 #endif | 479 #endif |
| 451 #define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[24].pCurrent) | 480 #define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[24].pCurrent) |
| 452 | 481 |
| 482 #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 |
| 453 { "getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0 }, | 483 { "getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0 }, |
| 484 #else |
| 485 { "getpagesize", (sqlite3_syscall_ptr)0, 0 }, |
| 486 #endif |
| 454 #define osGetpagesize ((int(*)(void))aSyscall[25].pCurrent) | 487 #define osGetpagesize ((int(*)(void))aSyscall[25].pCurrent) |
| 455 | 488 |
| 489 #if defined(HAVE_READLINK) |
| 456 { "readlink", (sqlite3_syscall_ptr)readlink, 0 }, | 490 { "readlink", (sqlite3_syscall_ptr)readlink, 0 }, |
| 491 #else |
| 492 { "readlink", (sqlite3_syscall_ptr)0, 0 }, |
| 493 #endif |
| 457 #define osReadlink ((ssize_t(*)(const char*,char*,size_t))aSyscall[26].pCurrent) | 494 #define osReadlink ((ssize_t(*)(const char*,char*,size_t))aSyscall[26].pCurrent) |
| 458 | 495 |
| 496 #if defined(HAVE_LSTAT) |
| 497 { "lstat", (sqlite3_syscall_ptr)lstat, 0 }, |
| 498 #else |
| 499 { "lstat", (sqlite3_syscall_ptr)0, 0 }, |
| 459 #endif | 500 #endif |
| 501 #define osLstat ((int(*)(const char*,struct stat*))aSyscall[27].pCurrent) |
| 460 | 502 |
| 461 }; /* End of the overrideable system calls */ | 503 }; /* End of the overrideable system calls */ |
| 462 | 504 |
| 463 | 505 |
| 464 /* | 506 /* |
| 465 ** On some systems, calls to fchown() will trigger a message in a security | 507 ** On some systems, calls to fchown() will trigger a message in a security |
| 466 ** log if they come from non-root processes. So avoid calling fchown() if | 508 ** log if they come from non-root processes. So avoid calling fchown() if |
| 467 ** we are not running as root. | 509 ** we are not running as root. |
| 468 */ | 510 */ |
| 469 static int robustFchown(int fd, uid_t uid, gid_t gid){ | 511 static int robustFchown(int fd, uid_t uid, gid_t gid){ |
| 470 #if OS_VXWORKS | 512 #if defined(HAVE_FCHOWN) |
| 513 return osGeteuid() ? 0 : osFchown(fd,uid,gid); |
| 514 #else |
| 471 return 0; | 515 return 0; |
| 472 #else | |
| 473 return osGeteuid() ? 0 : osFchown(fd,uid,gid); | |
| 474 #endif | 516 #endif |
| 475 } | 517 } |
| 476 | 518 |
| 477 /* | 519 /* |
| 478 ** This is the xSetSystemCall() method of sqlite3_vfs for all of the | 520 ** This is the xSetSystemCall() method of sqlite3_vfs for all of the |
| 479 ** "unix" VFSes. Return SQLITE_OK opon successfully updating the | 521 ** "unix" VFSes. Return SQLITE_OK opon successfully updating the |
| 480 ** system call pointer, or SQLITE_NOTFOUND if there is no configurable | 522 ** system call pointer, or SQLITE_NOTFOUND if there is no configurable |
| 481 ** system call named zName. | 523 ** system call named zName. |
| 482 */ | 524 */ |
| 483 static int unixSetSystemCall( | 525 static int unixSetSystemCall( |
| (...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1012 | 1054 |
| 1013 /* | 1055 /* |
| 1014 ** An instance of the following structure serves as the key used | 1056 ** An instance of the following structure serves as the key used |
| 1015 ** to locate a particular unixInodeInfo object. | 1057 ** to locate a particular unixInodeInfo object. |
| 1016 */ | 1058 */ |
| 1017 struct unixFileId { | 1059 struct unixFileId { |
| 1018 dev_t dev; /* Device number */ | 1060 dev_t dev; /* Device number */ |
| 1019 #if OS_VXWORKS | 1061 #if OS_VXWORKS |
| 1020 struct vxworksFileId *pId; /* Unique file ID for vxworks. */ | 1062 struct vxworksFileId *pId; /* Unique file ID for vxworks. */ |
| 1021 #else | 1063 #else |
| 1022 ino_t ino; /* Inode number */ | 1064 /* We are told that some versions of Android contain a bug that |
| 1065 ** sizes ino_t at only 32-bits instead of 64-bits. (See |
| 1066 ** https://android-review.googlesource.com/#/c/115351/3/dist/sqlite3.c) |
| 1067 ** To work around this, always allocate 64-bits for the inode number. |
| 1068 ** On small machines that only have 32-bit inodes, this wastes 4 bytes, |
| 1069 ** but that should not be a big deal. */ |
| 1070 /* WAS: ino_t ino; */ |
| 1071 u64 ino; /* Inode number */ |
| 1023 #endif | 1072 #endif |
| 1024 }; | 1073 }; |
| 1025 | 1074 |
| 1026 /* | 1075 /* |
| 1027 ** An instance of the following structure is allocated for each open | 1076 ** An instance of the following structure is allocated for each open |
| 1028 ** inode. Or, on LinuxThreads, there is one of these structures for | 1077 ** inode. Or, on LinuxThreads, there is one of these structures for |
| 1029 ** each inode opened by each thread. | 1078 ** each inode opened by each thread. |
| 1030 ** | 1079 ** |
| 1031 ** A single inode can have multiple file descriptors, so each unixFile | 1080 ** A single inode can have multiple file descriptors, so each unixFile |
| 1032 ** structure contains a pointer to an instance of this object and this | 1081 ** structure contains a pointer to an instance of this object and this |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1257 return SQLITE_IOERR; | 1306 return SQLITE_IOERR; |
| 1258 } | 1307 } |
| 1259 } | 1308 } |
| 1260 #endif | 1309 #endif |
| 1261 | 1310 |
| 1262 memset(&fileId, 0, sizeof(fileId)); | 1311 memset(&fileId, 0, sizeof(fileId)); |
| 1263 fileId.dev = statbuf.st_dev; | 1312 fileId.dev = statbuf.st_dev; |
| 1264 #if OS_VXWORKS | 1313 #if OS_VXWORKS |
| 1265 fileId.pId = pFile->pId; | 1314 fileId.pId = pFile->pId; |
| 1266 #else | 1315 #else |
| 1267 fileId.ino = statbuf.st_ino; | 1316 fileId.ino = (u64)statbuf.st_ino; |
| 1268 #endif | 1317 #endif |
| 1269 pInode = inodeList; | 1318 pInode = inodeList; |
| 1270 while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ | 1319 while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ |
| 1271 pInode = pInode->pNext; | 1320 pInode = pInode->pNext; |
| 1272 } | 1321 } |
| 1273 if( pInode==0 ){ | 1322 if( pInode==0 ){ |
| 1274 pInode = sqlite3_malloc64( sizeof(*pInode) ); | 1323 pInode = sqlite3_malloc64( sizeof(*pInode) ); |
| 1275 if( pInode==0 ){ | 1324 if( pInode==0 ){ |
| 1276 return SQLITE_NOMEM; | 1325 return SQLITE_NOMEM_BKPT; |
| 1277 } | 1326 } |
| 1278 memset(pInode, 0, sizeof(*pInode)); | 1327 memset(pInode, 0, sizeof(*pInode)); |
| 1279 memcpy(&pInode->fileId, &fileId, sizeof(fileId)); | 1328 memcpy(&pInode->fileId, &fileId, sizeof(fileId)); |
| 1280 pInode->nRef = 1; | 1329 pInode->nRef = 1; |
| 1281 pInode->pNext = inodeList; | 1330 pInode->pNext = inodeList; |
| 1282 pInode->pPrev = 0; | 1331 pInode->pPrev = 0; |
| 1283 if( inodeList ) inodeList->pPrev = pInode; | 1332 if( inodeList ) inodeList->pPrev = pInode; |
| 1284 inodeList = pInode; | 1333 inodeList = pInode; |
| 1285 }else{ | 1334 }else{ |
| 1286 pInode->nRef++; | 1335 pInode->nRef++; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1297 return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; | 1346 return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; |
| 1298 #else | 1347 #else |
| 1299 struct stat buf; | 1348 struct stat buf; |
| 1300 | 1349 |
| 1301 /* TODO(shess): This check doesn't work when the Chromium's WebDB code is | 1350 /* TODO(shess): This check doesn't work when the Chromium's WebDB code is |
| 1302 ** running in the sandbox. | 1351 ** running in the sandbox. |
| 1303 */ | 1352 */ |
| 1304 return 0; | 1353 return 0; |
| 1305 | 1354 |
| 1306 return pFile->pInode!=0 && | 1355 return pFile->pInode!=0 && |
| 1307 (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino); | 1356 (osStat(pFile->zPath, &buf)!=0 |
| 1357 || (u64)buf.st_ino!=pFile->pInode->fileId.ino); |
| 1308 #endif | 1358 #endif |
| 1309 } | 1359 } |
| 1310 | 1360 |
| 1311 | 1361 |
| 1312 /* | 1362 /* |
| 1313 ** Check a unixFile that is a database. Verify the following: | 1363 ** Check a unixFile that is a database. Verify the following: |
| 1314 ** | 1364 ** |
| 1315 ** (1) There is exactly one hard link on the file | 1365 ** (1) There is exactly one hard link on the file |
| 1316 ** (2) The file is not a symbolic link | 1366 ** (2) The file is not a symbolic link |
| 1317 ** (3) The file has not been renamed or unlinked | 1367 ** (3) The file has not been renamed or unlinked |
| 1318 ** | 1368 ** |
| 1319 ** Issue sqlite3_log(SQLITE_WARNING,...) messages if anything is not right. | 1369 ** Issue sqlite3_log(SQLITE_WARNING,...) messages if anything is not right. |
| 1320 */ | 1370 */ |
| 1321 static void verifyDbFile(unixFile *pFile){ | 1371 static void verifyDbFile(unixFile *pFile){ |
| 1322 struct stat buf; | 1372 struct stat buf; |
| 1323 int rc; | 1373 int rc; |
| 1374 |
| 1375 /* These verifications occurs for the main database only */ |
| 1376 if( pFile->ctrlFlags & UNIXFILE_NOLOCK ) return; |
| 1377 |
| 1324 rc = osFstat(pFile->h, &buf); | 1378 rc = osFstat(pFile->h, &buf); |
| 1325 if( rc!=0 ){ | 1379 if( rc!=0 ){ |
| 1326 sqlite3_log(SQLITE_WARNING, "cannot fstat db file %s", pFile->zPath); | 1380 sqlite3_log(SQLITE_WARNING, "cannot fstat db file %s", pFile->zPath); |
| 1327 return; | 1381 return; |
| 1328 } | 1382 } |
| 1329 if( buf.st_nlink==0 && (pFile->ctrlFlags & UNIXFILE_DELETE)==0 ){ | 1383 if( buf.st_nlink==0 ){ |
| 1330 sqlite3_log(SQLITE_WARNING, "file unlinked while open: %s", pFile->zPath); | 1384 sqlite3_log(SQLITE_WARNING, "file unlinked while open: %s", pFile->zPath); |
| 1331 return; | 1385 return; |
| 1332 } | 1386 } |
| 1333 if( buf.st_nlink>1 ){ | 1387 if( buf.st_nlink>1 ){ |
| 1334 sqlite3_log(SQLITE_WARNING, "multiple links to file: %s", pFile->zPath); | 1388 sqlite3_log(SQLITE_WARNING, "multiple links to file: %s", pFile->zPath); |
| 1335 return; | 1389 return; |
| 1336 } | 1390 } |
| 1337 if( fileHasMoved(pFile) ){ | 1391 if( fileHasMoved(pFile) ){ |
| 1338 sqlite3_log(SQLITE_WARNING, "file renamed while open: %s", pFile->zPath); | 1392 sqlite3_log(SQLITE_WARNING, "file renamed while open: %s", pFile->zPath); |
| 1339 return; | 1393 return; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1455 ** PENDING -> EXCLUSIVE | 1509 ** PENDING -> EXCLUSIVE |
| 1456 ** | 1510 ** |
| 1457 ** This routine will only increase a lock. Use the sqlite3OsUnlock() | 1511 ** This routine will only increase a lock. Use the sqlite3OsUnlock() |
| 1458 ** routine to lower a locking level. | 1512 ** routine to lower a locking level. |
| 1459 */ | 1513 */ |
| 1460 static int unixLock(sqlite3_file *id, int eFileLock){ | 1514 static int unixLock(sqlite3_file *id, int eFileLock){ |
| 1461 /* The following describes the implementation of the various locks and | 1515 /* The following describes the implementation of the various locks and |
| 1462 ** lock transitions in terms of the POSIX advisory shared and exclusive | 1516 ** lock transitions in terms of the POSIX advisory shared and exclusive |
| 1463 ** lock primitives (called read-locks and write-locks below, to avoid | 1517 ** lock primitives (called read-locks and write-locks below, to avoid |
| 1464 ** confusion with SQLite lock names). The algorithms are complicated | 1518 ** confusion with SQLite lock names). The algorithms are complicated |
| 1465 ** slightly in order to be compatible with windows systems simultaneously | 1519 ** slightly in order to be compatible with Windows95 systems simultaneously |
| 1466 ** accessing the same database file, in case that is ever required. | 1520 ** accessing the same database file, in case that is ever required. |
| 1467 ** | 1521 ** |
| 1468 ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved | 1522 ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved |
| 1469 ** byte', each single bytes at well known offsets, and the 'shared byte | 1523 ** byte', each single bytes at well known offsets, and the 'shared byte |
| 1470 ** range', a range of 510 bytes at a well known offset. | 1524 ** range', a range of 510 bytes at a well known offset. |
| 1471 ** | 1525 ** |
| 1472 ** To obtain a SHARED lock, a read-lock is obtained on the 'pending | 1526 ** To obtain a SHARED lock, a read-lock is obtained on the 'pending |
| 1473 ** byte'. If this is successful, a random byte from the 'shared byte | 1527 ** byte'. If this is successful, 'shared byte range' is read-locked |
| 1474 ** range' is read-locked and the lock on the 'pending byte' released. | 1528 ** and the lock on the 'pending byte' released. (Legacy note: When |
| 1529 ** SQLite was first developed, Windows95 systems were still very common, |
| 1530 ** and Widnows95 lacks a shared-lock capability. So on Windows95, a |
| 1531 ** single randomly selected by from the 'shared byte range' is locked. |
| 1532 ** Windows95 is now pretty much extinct, but this work-around for the |
| 1533 ** lack of shared-locks on Windows95 lives on, for backwards |
| 1534 ** compatibility.) |
| 1475 ** | 1535 ** |
| 1476 ** A process may only obtain a RESERVED lock after it has a SHARED lock. | 1536 ** A process may only obtain a RESERVED lock after it has a SHARED lock. |
| 1477 ** A RESERVED lock is implemented by grabbing a write-lock on the | 1537 ** A RESERVED lock is implemented by grabbing a write-lock on the |
| 1478 ** 'reserved byte'. | 1538 ** 'reserved byte'. |
| 1479 ** | 1539 ** |
| 1480 ** A process may only obtain a PENDING lock after it has obtained a | 1540 ** A process may only obtain a PENDING lock after it has obtained a |
| 1481 ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock | 1541 ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock |
| 1482 ** on the 'pending byte'. This ensures that no new SHARED locks can be | 1542 ** on the 'pending byte'. This ensures that no new SHARED locks can be |
| 1483 ** obtained, but existing SHARED locks are allowed to persist. A process | 1543 ** obtained, but existing SHARED locks are allowed to persist. A process |
| 1484 ** does not have to obtain a RESERVED lock on the way to a PENDING lock. | 1544 ** does not have to obtain a RESERVED lock on the way to a PENDING lock. |
| 1485 ** This property is used by the algorithm for rolling back a journal file | 1545 ** This property is used by the algorithm for rolling back a journal file |
| 1486 ** after a crash. | 1546 ** after a crash. |
| 1487 ** | 1547 ** |
| 1488 ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is | 1548 ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is |
| 1489 ** implemented by obtaining a write-lock on the entire 'shared byte | 1549 ** implemented by obtaining a write-lock on the entire 'shared byte |
| 1490 ** range'. Since all other locks require a read-lock on one of the bytes | 1550 ** range'. Since all other locks require a read-lock on one of the bytes |
| 1491 ** within this range, this ensures that no other locks are held on the | 1551 ** within this range, this ensures that no other locks are held on the |
| 1492 ** database. | 1552 ** database. |
| 1493 ** | |
| 1494 ** The reason a single byte cannot be used instead of the 'shared byte | |
| 1495 ** range' is that some versions of windows do not support read-locks. By | |
| 1496 ** locking a random byte from a range, concurrent SHARED locks may exist | |
| 1497 ** even if the locking primitive used is always a write-lock. | |
| 1498 */ | 1553 */ |
| 1499 int rc = SQLITE_OK; | 1554 int rc = SQLITE_OK; |
| 1500 unixFile *pFile = (unixFile*)id; | 1555 unixFile *pFile = (unixFile*)id; |
| 1501 unixInodeInfo *pInode; | 1556 unixInodeInfo *pInode; |
| 1502 struct flock lock; | 1557 struct flock lock; |
| 1503 int tErrno = 0; | 1558 int tErrno = 0; |
| 1504 | 1559 |
| 1505 assert( pFile ); | 1560 assert( pFile ); |
| 1506 OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, | 1561 OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, |
| 1507 azFileLock(eFileLock), azFileLock(pFile->eFileLock), | 1562 azFileLock(eFileLock), azFileLock(pFile->eFileLock), |
| (...skipping 1626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3134 | 3189 |
| 3135 /* If this is a database file (not a journal, master-journal or temp | 3190 /* If this is a database file (not a journal, master-journal or temp |
| 3136 ** file), the bytes in the locking range should never be read or written. */ | 3191 ** file), the bytes in the locking range should never be read or written. */ |
| 3137 #if 0 | 3192 #if 0 |
| 3138 assert( pFile->pUnused==0 | 3193 assert( pFile->pUnused==0 |
| 3139 || offset>=PENDING_BYTE+512 | 3194 || offset>=PENDING_BYTE+512 |
| 3140 || offset+amt<=PENDING_BYTE | 3195 || offset+amt<=PENDING_BYTE |
| 3141 ); | 3196 ); |
| 3142 #endif | 3197 #endif |
| 3143 | 3198 |
| 3144 #if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 | 3199 #if SQLITE_MAX_MMAP_SIZE>0 |
| 3145 /* Deal with as much of this read request as possible by transfering | 3200 /* Deal with as much of this read request as possible by transfering |
| 3146 ** data from the memory mapping using memcpy(). */ | 3201 ** data from the memory mapping using memcpy(). */ |
| 3147 if( offset<pFile->mmapSize ){ | 3202 if( offset<pFile->mmapSize ){ |
| 3148 if( offset+amt <= pFile->mmapSize ){ | 3203 if( offset+amt <= pFile->mmapSize ){ |
| 3149 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); | 3204 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); |
| 3150 return SQLITE_OK; | 3205 return SQLITE_OK; |
| 3151 }else{ | 3206 }else{ |
| 3152 int nCopy = pFile->mmapSize - offset; | 3207 int nCopy = pFile->mmapSize - offset; |
| 3153 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); | 3208 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); |
| 3154 pBuf = &((u8 *)pBuf)[nCopy]; | 3209 pBuf = &((u8 *)pBuf)[nCopy]; |
| (...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4192 static int unixOpenSharedMemory(unixFile *pDbFd){ | 4247 static int unixOpenSharedMemory(unixFile *pDbFd){ |
| 4193 struct unixShm *p = 0; /* The connection to be opened */ | 4248 struct unixShm *p = 0; /* The connection to be opened */ |
| 4194 struct unixShmNode *pShmNode; /* The underlying mmapped file */ | 4249 struct unixShmNode *pShmNode; /* The underlying mmapped file */ |
| 4195 int rc; /* Result code */ | 4250 int rc; /* Result code */ |
| 4196 unixInodeInfo *pInode; /* The inode of fd */ | 4251 unixInodeInfo *pInode; /* The inode of fd */ |
| 4197 char *zShmFilename; /* Name of the file used for SHM */ | 4252 char *zShmFilename; /* Name of the file used for SHM */ |
| 4198 int nShmFilename; /* Size of the SHM filename in bytes */ | 4253 int nShmFilename; /* Size of the SHM filename in bytes */ |
| 4199 | 4254 |
| 4200 /* Allocate space for the new unixShm object. */ | 4255 /* Allocate space for the new unixShm object. */ |
| 4201 p = sqlite3_malloc64( sizeof(*p) ); | 4256 p = sqlite3_malloc64( sizeof(*p) ); |
| 4202 if( p==0 ) return SQLITE_NOMEM; | 4257 if( p==0 ) return SQLITE_NOMEM_BKPT; |
| 4203 memset(p, 0, sizeof(*p)); | 4258 memset(p, 0, sizeof(*p)); |
| 4204 assert( pDbFd->pShm==0 ); | 4259 assert( pDbFd->pShm==0 ); |
| 4205 | 4260 |
| 4206 /* Check to see if a unixShmNode object already exists. Reuse an existing | 4261 /* Check to see if a unixShmNode object already exists. Reuse an existing |
| 4207 ** one if present. Create a new one if necessary. | 4262 ** one if present. Create a new one if necessary. |
| 4208 */ | 4263 */ |
| 4209 unixEnterMutex(); | 4264 unixEnterMutex(); |
| 4210 pInode = pDbFd->pInode; | 4265 pInode = pDbFd->pInode; |
| 4211 pShmNode = pInode->pShmNode; | 4266 pShmNode = pInode->pShmNode; |
| 4212 if( pShmNode==0 ){ | 4267 if( pShmNode==0 ){ |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4224 goto shm_open_err; | 4279 goto shm_open_err; |
| 4225 } | 4280 } |
| 4226 | 4281 |
| 4227 #ifdef SQLITE_SHM_DIRECTORY | 4282 #ifdef SQLITE_SHM_DIRECTORY |
| 4228 nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 31; | 4283 nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 31; |
| 4229 #else | 4284 #else |
| 4230 nShmFilename = 6 + (int)strlen(zBasePath); | 4285 nShmFilename = 6 + (int)strlen(zBasePath); |
| 4231 #endif | 4286 #endif |
| 4232 pShmNode = sqlite3_malloc64( sizeof(*pShmNode) + nShmFilename ); | 4287 pShmNode = sqlite3_malloc64( sizeof(*pShmNode) + nShmFilename ); |
| 4233 if( pShmNode==0 ){ | 4288 if( pShmNode==0 ){ |
| 4234 rc = SQLITE_NOMEM; | 4289 rc = SQLITE_NOMEM_BKPT; |
| 4235 goto shm_open_err; | 4290 goto shm_open_err; |
| 4236 } | 4291 } |
| 4237 memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); | 4292 memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); |
| 4238 zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1]; | 4293 zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1]; |
| 4239 #ifdef SQLITE_SHM_DIRECTORY | 4294 #ifdef SQLITE_SHM_DIRECTORY |
| 4240 sqlite3_snprintf(nShmFilename, zShmFilename, | 4295 sqlite3_snprintf(nShmFilename, zShmFilename, |
| 4241 SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x", | 4296 SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x", |
| 4242 (u32)sStat.st_ino, (u32)sStat.st_dev); | 4297 (u32)sStat.st_ino, (u32)sStat.st_dev); |
| 4243 #else | 4298 #else |
| 4244 sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", zBasePath); | 4299 sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", zBasePath); |
| 4245 sqlite3FileSuffix3(pDbFd->zPath, zShmFilename); | 4300 sqlite3FileSuffix3(pDbFd->zPath, zShmFilename); |
| 4246 #endif | 4301 #endif |
| 4247 pShmNode->h = -1; | 4302 pShmNode->h = -1; |
| 4248 pDbFd->pInode->pShmNode = pShmNode; | 4303 pDbFd->pInode->pShmNode = pShmNode; |
| 4249 pShmNode->pInode = pDbFd->pInode; | 4304 pShmNode->pInode = pDbFd->pInode; |
| 4250 pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); | 4305 if( sqlite3GlobalConfig.bCoreMutex ){ |
| 4251 if( pShmNode->mutex==0 ){ | 4306 pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); |
| 4252 rc = SQLITE_NOMEM; | 4307 if( pShmNode->mutex==0 ){ |
| 4253 goto shm_open_err; | 4308 rc = SQLITE_NOMEM_BKPT; |
| 4309 goto shm_open_err; |
| 4310 } |
| 4254 } | 4311 } |
| 4255 | 4312 |
| 4256 if( pInode->bProcessLock==0 ){ | 4313 if( pInode->bProcessLock==0 ){ |
| 4257 int openFlags = O_RDWR | O_CREAT; | 4314 int openFlags = O_RDWR | O_CREAT; |
| 4258 if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ | 4315 if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ |
| 4259 openFlags = O_RDONLY; | 4316 openFlags = O_RDONLY; |
| 4260 pShmNode->isReadonly = 1; | 4317 pShmNode->isReadonly = 1; |
| 4261 } | 4318 } |
| 4262 pShmNode->h = robust_open(zShmFilename, openFlags, (sStat.st_mode&0777)); | 4319 pShmNode->h = robust_open(zShmFilename, openFlags, (sStat.st_mode&0777)); |
| 4263 if( pShmNode->h<0 ){ | 4320 if( pShmNode->h<0 ){ |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4415 } | 4472 } |
| 4416 } | 4473 } |
| 4417 } | 4474 } |
| 4418 } | 4475 } |
| 4419 | 4476 |
| 4420 /* Map the requested memory region into this processes address space. */ | 4477 /* Map the requested memory region into this processes address space. */ |
| 4421 apNew = (char **)sqlite3_realloc( | 4478 apNew = (char **)sqlite3_realloc( |
| 4422 pShmNode->apRegion, nReqRegion*sizeof(char *) | 4479 pShmNode->apRegion, nReqRegion*sizeof(char *) |
| 4423 ); | 4480 ); |
| 4424 if( !apNew ){ | 4481 if( !apNew ){ |
| 4425 rc = SQLITE_IOERR_NOMEM; | 4482 rc = SQLITE_IOERR_NOMEM_BKPT; |
| 4426 goto shmpage_out; | 4483 goto shmpage_out; |
| 4427 } | 4484 } |
| 4428 pShmNode->apRegion = apNew; | 4485 pShmNode->apRegion = apNew; |
| 4429 while( pShmNode->nRegion<nReqRegion ){ | 4486 while( pShmNode->nRegion<nReqRegion ){ |
| 4430 int nMap = szRegion*nShmPerMap; | 4487 int nMap = szRegion*nShmPerMap; |
| 4431 int i; | 4488 int i; |
| 4432 void *pMem; | 4489 void *pMem; |
| 4433 if( pShmNode->h>=0 ){ | 4490 if( pShmNode->h>=0 ){ |
| 4434 pMem = osMmap(0, nMap, | 4491 pMem = osMmap(0, nMap, |
| 4435 pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, | 4492 pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, |
| 4436 MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion | 4493 MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion |
| 4437 ); | 4494 ); |
| 4438 if( pMem==MAP_FAILED ){ | 4495 if( pMem==MAP_FAILED ){ |
| 4439 rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename); | 4496 rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename); |
| 4440 goto shmpage_out; | 4497 goto shmpage_out; |
| 4441 } | 4498 } |
| 4442 }else{ | 4499 }else{ |
| 4443 pMem = sqlite3_malloc64(szRegion); | 4500 pMem = sqlite3_malloc64(szRegion); |
| 4444 if( pMem==0 ){ | 4501 if( pMem==0 ){ |
| 4445 rc = SQLITE_NOMEM; | 4502 rc = SQLITE_NOMEM_BKPT; |
| 4446 goto shmpage_out; | 4503 goto shmpage_out; |
| 4447 } | 4504 } |
| 4448 memset(pMem, 0, szRegion); | 4505 memset(pMem, 0, szRegion); |
| 4449 } | 4506 } |
| 4450 | 4507 |
| 4451 for(i=0; i<nShmPerMap; i++){ | 4508 for(i=0; i<nShmPerMap; i++){ |
| 4452 pShmNode->apRegion[pShmNode->nRegion+i] = &((char*)pMem)[szRegion*i]; | 4509 pShmNode->apRegion[pShmNode->nRegion+i] = &((char*)pMem)[szRegion*i]; |
| 4453 } | 4510 } |
| 4454 pShmNode->nRegion += nShmPerMap; | 4511 pShmNode->nRegion += nShmPerMap; |
| 4455 } | 4512 } |
| (...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5213 pNew->ctrlFlags |= UNIXFILE_PSOW; | 5270 pNew->ctrlFlags |= UNIXFILE_PSOW; |
| 5214 } | 5271 } |
| 5215 if( strcmp(pVfs->zName,"unix-excl")==0 ){ | 5272 if( strcmp(pVfs->zName,"unix-excl")==0 ){ |
| 5216 pNew->ctrlFlags |= UNIXFILE_EXCL; | 5273 pNew->ctrlFlags |= UNIXFILE_EXCL; |
| 5217 } | 5274 } |
| 5218 | 5275 |
| 5219 #if OS_VXWORKS | 5276 #if OS_VXWORKS |
| 5220 pNew->pId = vxworksFindFileId(zFilename); | 5277 pNew->pId = vxworksFindFileId(zFilename); |
| 5221 if( pNew->pId==0 ){ | 5278 if( pNew->pId==0 ){ |
| 5222 ctrlFlags |= UNIXFILE_NOLOCK; | 5279 ctrlFlags |= UNIXFILE_NOLOCK; |
| 5223 rc = SQLITE_NOMEM; | 5280 rc = SQLITE_NOMEM_BKPT; |
| 5224 } | 5281 } |
| 5225 #endif | 5282 #endif |
| 5226 | 5283 |
| 5227 if( ctrlFlags & UNIXFILE_NOLOCK ){ | 5284 if( ctrlFlags & UNIXFILE_NOLOCK ){ |
| 5228 pLockingStyle = &nolockIoMethods; | 5285 pLockingStyle = &nolockIoMethods; |
| 5229 }else{ | 5286 }else{ |
| 5230 pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew); | 5287 pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew); |
| 5231 #if SQLITE_ENABLE_LOCKING_STYLE | 5288 #if SQLITE_ENABLE_LOCKING_STYLE |
| 5232 /* Cache zFilename in the locking context (AFP and dotlock override) for | 5289 /* Cache zFilename in the locking context (AFP and dotlock override) for |
| 5233 ** proxyLock activation is possible (remote proxy is based on db name) | 5290 ** proxyLock activation is possible (remote proxy is based on db name) |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5269 } | 5326 } |
| 5270 | 5327 |
| 5271 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) | 5328 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) |
| 5272 else if( pLockingStyle == &afpIoMethods ){ | 5329 else if( pLockingStyle == &afpIoMethods ){ |
| 5273 /* AFP locking uses the file path so it needs to be included in | 5330 /* AFP locking uses the file path so it needs to be included in |
| 5274 ** the afpLockingContext. | 5331 ** the afpLockingContext. |
| 5275 */ | 5332 */ |
| 5276 afpLockingContext *pCtx; | 5333 afpLockingContext *pCtx; |
| 5277 pNew->lockingContext = pCtx = sqlite3_malloc64( sizeof(*pCtx) ); | 5334 pNew->lockingContext = pCtx = sqlite3_malloc64( sizeof(*pCtx) ); |
| 5278 if( pCtx==0 ){ | 5335 if( pCtx==0 ){ |
| 5279 rc = SQLITE_NOMEM; | 5336 rc = SQLITE_NOMEM_BKPT; |
| 5280 }else{ | 5337 }else{ |
| 5281 /* NB: zFilename exists and remains valid until the file is closed | 5338 /* NB: zFilename exists and remains valid until the file is closed |
| 5282 ** according to requirement F11141. So we do not need to make a | 5339 ** according to requirement F11141. So we do not need to make a |
| 5283 ** copy of the filename. */ | 5340 ** copy of the filename. */ |
| 5284 pCtx->dbPath = zFilename; | 5341 pCtx->dbPath = zFilename; |
| 5285 pCtx->reserved = 0; | 5342 pCtx->reserved = 0; |
| 5286 srandomdev(); | 5343 srandomdev(); |
| 5287 unixEnterMutex(); | 5344 unixEnterMutex(); |
| 5288 rc = findInodeInfo(pNew, &pNew->pInode); | 5345 rc = findInodeInfo(pNew, &pNew->pInode); |
| 5289 if( rc!=SQLITE_OK ){ | 5346 if( rc!=SQLITE_OK ){ |
| 5290 sqlite3_free(pNew->lockingContext); | 5347 sqlite3_free(pNew->lockingContext); |
| 5291 robust_close(pNew, h, __LINE__); | 5348 robust_close(pNew, h, __LINE__); |
| 5292 h = -1; | 5349 h = -1; |
| 5293 } | 5350 } |
| 5294 unixLeaveMutex(); | 5351 unixLeaveMutex(); |
| 5295 } | 5352 } |
| 5296 } | 5353 } |
| 5297 #endif | 5354 #endif |
| 5298 | 5355 |
| 5299 else if( pLockingStyle == &dotlockIoMethods ){ | 5356 else if( pLockingStyle == &dotlockIoMethods ){ |
| 5300 /* Dotfile locking uses the file path so it needs to be included in | 5357 /* Dotfile locking uses the file path so it needs to be included in |
| 5301 ** the dotlockLockingContext | 5358 ** the dotlockLockingContext |
| 5302 */ | 5359 */ |
| 5303 char *zLockFile; | 5360 char *zLockFile; |
| 5304 int nFilename; | 5361 int nFilename; |
| 5305 assert( zFilename!=0 ); | 5362 assert( zFilename!=0 ); |
| 5306 nFilename = (int)strlen(zFilename) + 6; | 5363 nFilename = (int)strlen(zFilename) + 6; |
| 5307 zLockFile = (char *)sqlite3_malloc64(nFilename); | 5364 zLockFile = (char *)sqlite3_malloc64(nFilename); |
| 5308 if( zLockFile==0 ){ | 5365 if( zLockFile==0 ){ |
| 5309 rc = SQLITE_NOMEM; | 5366 rc = SQLITE_NOMEM_BKPT; |
| 5310 }else{ | 5367 }else{ |
| 5311 sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename); | 5368 sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename); |
| 5312 } | 5369 } |
| 5313 pNew->lockingContext = zLockFile; | 5370 pNew->lockingContext = zLockFile; |
| 5314 } | 5371 } |
| 5315 | 5372 |
| 5316 #if OS_VXWORKS | 5373 #if OS_VXWORKS |
| 5317 else if( pLockingStyle == &semIoMethods ){ | 5374 else if( pLockingStyle == &semIoMethods ){ |
| 5318 /* Named semaphore locking uses the file path so it needs to be | 5375 /* Named semaphore locking uses the file path so it needs to be |
| 5319 ** included in the semLockingContext | 5376 ** included in the semLockingContext |
| 5320 */ | 5377 */ |
| 5321 unixEnterMutex(); | 5378 unixEnterMutex(); |
| 5322 rc = findInodeInfo(pNew, &pNew->pInode); | 5379 rc = findInodeInfo(pNew, &pNew->pInode); |
| 5323 if( (rc==SQLITE_OK) && (pNew->pInode->pSem==NULL) ){ | 5380 if( (rc==SQLITE_OK) && (pNew->pInode->pSem==NULL) ){ |
| 5324 char *zSemName = pNew->pInode->aSemName; | 5381 char *zSemName = pNew->pInode->aSemName; |
| 5325 int n; | 5382 int n; |
| 5326 sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem", | 5383 sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem", |
| 5327 pNew->pId->zCanonicalName); | 5384 pNew->pId->zCanonicalName); |
| 5328 for( n=1; zSemName[n]; n++ ) | 5385 for( n=1; zSemName[n]; n++ ) |
| 5329 if( zSemName[n]=='/' ) zSemName[n] = '_'; | 5386 if( zSemName[n]=='/' ) zSemName[n] = '_'; |
| 5330 pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1); | 5387 pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1); |
| 5331 if( pNew->pInode->pSem == SEM_FAILED ){ | 5388 if( pNew->pInode->pSem == SEM_FAILED ){ |
| 5332 rc = SQLITE_NOMEM; | 5389 rc = SQLITE_NOMEM_BKPT; |
| 5333 pNew->pInode->aSemName[0] = '\0'; | 5390 pNew->pInode->aSemName[0] = '\0'; |
| 5334 } | 5391 } |
| 5335 } | 5392 } |
| 5336 unixLeaveMutex(); | 5393 unixLeaveMutex(); |
| 5337 } | 5394 } |
| 5338 #endif | 5395 #endif |
| 5339 | 5396 |
| 5340 storeLastErrno(pNew, 0); | 5397 storeLastErrno(pNew, 0); |
| 5341 #if OS_VXWORKS | 5398 #if OS_VXWORKS |
| 5342 if( rc!=SQLITE_OK ){ | 5399 if( rc!=SQLITE_OK ){ |
| (...skipping 19 matching lines...) Expand all Loading... |
| 5362 */ | 5419 */ |
| 5363 static const char *unixTempFileDir(void){ | 5420 static const char *unixTempFileDir(void){ |
| 5364 static const char *azDirs[] = { | 5421 static const char *azDirs[] = { |
| 5365 0, | 5422 0, |
| 5366 0, | 5423 0, |
| 5367 "/var/tmp", | 5424 "/var/tmp", |
| 5368 "/usr/tmp", | 5425 "/usr/tmp", |
| 5369 "/tmp", | 5426 "/tmp", |
| 5370 "." | 5427 "." |
| 5371 }; | 5428 }; |
| 5372 unsigned int i; | 5429 unsigned int i = 0; |
| 5373 struct stat buf; | 5430 struct stat buf; |
| 5374 const char *zDir = sqlite3_temp_directory; | 5431 const char *zDir = sqlite3_temp_directory; |
| 5375 | 5432 |
| 5376 if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR"); | 5433 if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR"); |
| 5377 if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); | 5434 if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); |
| 5378 for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); zDir=azDirs[i++]){ | 5435 while(1){ |
| 5379 if( zDir==0 ) continue; | 5436 if( zDir!=0 |
| 5380 if( osStat(zDir, &buf) ) continue; | 5437 && osStat(zDir, &buf)==0 |
| 5381 if( !S_ISDIR(buf.st_mode) ) continue; | 5438 && S_ISDIR(buf.st_mode) |
| 5382 if( osAccess(zDir, 07) ) continue; | 5439 && osAccess(zDir, 03)==0 |
| 5383 break; | 5440 ){ |
| 5441 return zDir; |
| 5442 } |
| 5443 if( i>=sizeof(azDirs)/sizeof(azDirs[0]) ) break; |
| 5444 zDir = azDirs[i++]; |
| 5384 } | 5445 } |
| 5385 return zDir; | 5446 return 0; |
| 5386 } | 5447 } |
| 5387 | 5448 |
| 5388 /* | 5449 /* |
| 5389 ** Create a temporary file name in zBuf. zBuf must be allocated | 5450 ** Create a temporary file name in zBuf. zBuf must be allocated |
| 5390 ** by the calling process and must be big enough to hold at least | 5451 ** by the calling process and must be big enough to hold at least |
| 5391 ** pVfs->mxPathname bytes. | 5452 ** pVfs->mxPathname bytes. |
| 5392 */ | 5453 */ |
| 5393 static int unixGetTempname(int nBuf, char *zBuf){ | 5454 static int unixGetTempname(int nBuf, char *zBuf){ |
| 5394 const char *zDir; | 5455 const char *zDir; |
| 5395 int iLimit = 0; | 5456 int iLimit = 0; |
| 5396 | 5457 |
| 5397 /* It's odd to simulate an io-error here, but really this is just | 5458 /* It's odd to simulate an io-error here, but really this is just |
| 5398 ** using the io-error infrastructure to test that SQLite handles this | 5459 ** using the io-error infrastructure to test that SQLite handles this |
| 5399 ** function failing. | 5460 ** function failing. |
| 5400 */ | 5461 */ |
| 5462 zBuf[0] = 0; |
| 5401 SimulateIOError( return SQLITE_IOERR ); | 5463 SimulateIOError( return SQLITE_IOERR ); |
| 5402 | 5464 |
| 5403 zDir = unixTempFileDir(); | 5465 zDir = unixTempFileDir(); |
| 5466 if( zDir==0 ) return SQLITE_IOERR_GETTEMPPATH; |
| 5404 do{ | 5467 do{ |
| 5405 u64 r; | 5468 u64 r; |
| 5406 sqlite3_randomness(sizeof(r), &r); | 5469 sqlite3_randomness(sizeof(r), &r); |
| 5407 assert( nBuf>2 ); | 5470 assert( nBuf>2 ); |
| 5408 zBuf[nBuf-2] = 0; | 5471 zBuf[nBuf-2] = 0; |
| 5409 sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", | 5472 sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", |
| 5410 zDir, r, 0); | 5473 zDir, r, 0); |
| 5411 if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR; | 5474 if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR; |
| 5412 }while( osAccess(zBuf,0)==0 ); | 5475 }while( osAccess(zBuf,0)==0 ); |
| 5413 return SQLITE_OK; | 5476 return SQLITE_OK; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5456 ** descriptor on the same path, fail, and return an error to SQLite. | 5519 ** descriptor on the same path, fail, and return an error to SQLite. |
| 5457 ** | 5520 ** |
| 5458 ** Even if a subsequent open() call does succeed, the consequences of | 5521 ** Even if a subsequent open() call does succeed, the consequences of |
| 5459 ** not searching for a reusable file descriptor are not dire. */ | 5522 ** not searching for a reusable file descriptor are not dire. */ |
| 5460 if( 0==osStat(zPath, &sStat) ){ | 5523 if( 0==osStat(zPath, &sStat) ){ |
| 5461 unixInodeInfo *pInode; | 5524 unixInodeInfo *pInode; |
| 5462 | 5525 |
| 5463 unixEnterMutex(); | 5526 unixEnterMutex(); |
| 5464 pInode = inodeList; | 5527 pInode = inodeList; |
| 5465 while( pInode && (pInode->fileId.dev!=sStat.st_dev | 5528 while( pInode && (pInode->fileId.dev!=sStat.st_dev |
| 5466 || pInode->fileId.ino!=sStat.st_ino) ){ | 5529 || pInode->fileId.ino!=(u64)sStat.st_ino) ){ |
| 5467 pInode = pInode->pNext; | 5530 pInode = pInode->pNext; |
| 5468 } | 5531 } |
| 5469 if( pInode ){ | 5532 if( pInode ){ |
| 5470 UnixUnusedFd **pp; | 5533 UnixUnusedFd **pp; |
| 5471 for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); | 5534 for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); |
| 5472 pUnused = *pp; | 5535 pUnused = *pp; |
| 5473 if( pUnused ){ | 5536 if( pUnused ){ |
| 5474 *pp = pUnused->pNext; | 5537 *pp = pUnused->pNext; |
| 5475 } | 5538 } |
| 5476 } | 5539 } |
| 5477 unixLeaveMutex(); | 5540 unixLeaveMutex(); |
| 5478 } | 5541 } |
| 5479 #endif /* if !OS_VXWORKS */ | 5542 #endif /* if !OS_VXWORKS */ |
| 5480 return pUnused; | 5543 return pUnused; |
| 5481 } | 5544 } |
| 5482 | 5545 |
| 5483 /* | 5546 /* |
| 5547 ** Find the mode, uid and gid of file zFile. |
| 5548 */ |
| 5549 static int getFileMode( |
| 5550 const char *zFile, /* File name */ |
| 5551 mode_t *pMode, /* OUT: Permissions of zFile */ |
| 5552 uid_t *pUid, /* OUT: uid of zFile. */ |
| 5553 gid_t *pGid /* OUT: gid of zFile. */ |
| 5554 ){ |
| 5555 struct stat sStat; /* Output of stat() on database file */ |
| 5556 int rc = SQLITE_OK; |
| 5557 if( 0==osStat(zFile, &sStat) ){ |
| 5558 *pMode = sStat.st_mode & 0777; |
| 5559 *pUid = sStat.st_uid; |
| 5560 *pGid = sStat.st_gid; |
| 5561 }else{ |
| 5562 rc = SQLITE_IOERR_FSTAT; |
| 5563 } |
| 5564 return rc; |
| 5565 } |
| 5566 |
| 5567 /* |
| 5484 ** This function is called by unixOpen() to determine the unix permissions | 5568 ** This function is called by unixOpen() to determine the unix permissions |
| 5485 ** to create new files with. If no error occurs, then SQLITE_OK is returned | 5569 ** to create new files with. If no error occurs, then SQLITE_OK is returned |
| 5486 ** and a value suitable for passing as the third argument to open(2) is | 5570 ** and a value suitable for passing as the third argument to open(2) is |
| 5487 ** written to *pMode. If an IO error occurs, an SQLite error code is | 5571 ** written to *pMode. If an IO error occurs, an SQLite error code is |
| 5488 ** returned and the value of *pMode is not modified. | 5572 ** returned and the value of *pMode is not modified. |
| 5489 ** | 5573 ** |
| 5490 ** In most cases, this routine sets *pMode to 0, which will become | 5574 ** In most cases, this routine sets *pMode to 0, which will become |
| 5491 ** an indication to robust_open() to create the file using | 5575 ** an indication to robust_open() to create the file using |
| 5492 ** SQLITE_DEFAULT_FILE_PERMISSIONS adjusted by the umask. | 5576 ** SQLITE_DEFAULT_FILE_PERMISSIONS adjusted by the umask. |
| 5493 ** But if the file being opened is a WAL or regular journal file, then | 5577 ** But if the file being opened is a WAL or regular journal file, then |
| (...skipping 14 matching lines...) Expand all Loading... |
| 5508 uid_t *pUid, /* OUT: uid to set on the file */ | 5592 uid_t *pUid, /* OUT: uid to set on the file */ |
| 5509 gid_t *pGid /* OUT: gid to set on the file */ | 5593 gid_t *pGid /* OUT: gid to set on the file */ |
| 5510 ){ | 5594 ){ |
| 5511 int rc = SQLITE_OK; /* Return Code */ | 5595 int rc = SQLITE_OK; /* Return Code */ |
| 5512 *pMode = 0; | 5596 *pMode = 0; |
| 5513 *pUid = 0; | 5597 *pUid = 0; |
| 5514 *pGid = 0; | 5598 *pGid = 0; |
| 5515 if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ | 5599 if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ |
| 5516 char zDb[MAX_PATHNAME+1]; /* Database file path */ | 5600 char zDb[MAX_PATHNAME+1]; /* Database file path */ |
| 5517 int nDb; /* Number of valid bytes in zDb */ | 5601 int nDb; /* Number of valid bytes in zDb */ |
| 5518 struct stat sStat; /* Output of stat() on database file */ | |
| 5519 | 5602 |
| 5520 /* zPath is a path to a WAL or journal file. The following block derives | 5603 /* zPath is a path to a WAL or journal file. The following block derives |
| 5521 ** the path to the associated database file from zPath. This block handles | 5604 ** the path to the associated database file from zPath. This block handles |
| 5522 ** the following naming conventions: | 5605 ** the following naming conventions: |
| 5523 ** | 5606 ** |
| 5524 ** "<path to db>-journal" | 5607 ** "<path to db>-journal" |
| 5525 ** "<path to db>-wal" | 5608 ** "<path to db>-wal" |
| 5526 ** "<path to db>-journalNN" | 5609 ** "<path to db>-journalNN" |
| 5527 ** "<path to db>-walNN" | 5610 ** "<path to db>-walNN" |
| 5528 ** | 5611 ** |
| (...skipping 10 matching lines...) Expand all Loading... |
| 5539 #else | 5622 #else |
| 5540 /* If 8+3 names are possible, then the journal file might not contain | 5623 /* If 8+3 names are possible, then the journal file might not contain |
| 5541 ** a '-' character. So check for that case and return early. */ | 5624 ** a '-' character. So check for that case and return early. */ |
| 5542 if( nDb==0 || zPath[nDb]=='.' ) return SQLITE_OK; | 5625 if( nDb==0 || zPath[nDb]=='.' ) return SQLITE_OK; |
| 5543 #endif | 5626 #endif |
| 5544 nDb--; | 5627 nDb--; |
| 5545 } | 5628 } |
| 5546 memcpy(zDb, zPath, nDb); | 5629 memcpy(zDb, zPath, nDb); |
| 5547 zDb[nDb] = '\0'; | 5630 zDb[nDb] = '\0'; |
| 5548 | 5631 |
| 5549 if( 0==osStat(zDb, &sStat) ){ | 5632 rc = getFileMode(zDb, pMode, pUid, pGid); |
| 5550 *pMode = sStat.st_mode & 0777; | |
| 5551 *pUid = sStat.st_uid; | |
| 5552 *pGid = sStat.st_gid; | |
| 5553 }else{ | |
| 5554 rc = SQLITE_IOERR_FSTAT; | |
| 5555 } | |
| 5556 }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ | 5633 }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ |
| 5557 *pMode = 0600; | 5634 *pMode = 0600; |
| 5635 }else if( flags & SQLITE_OPEN_URI ){ |
| 5636 /* If this is a main database file and the file was opened using a URI |
| 5637 ** filename, check for the "modeof" parameter. If present, interpret |
| 5638 ** its value as a filename and try to copy the mode, uid and gid from |
| 5639 ** that file. */ |
| 5640 const char *z = sqlite3_uri_parameter(zPath, "modeof"); |
| 5641 if( z ){ |
| 5642 rc = getFileMode(z, pMode, pUid, pGid); |
| 5643 } |
| 5558 } | 5644 } |
| 5559 return rc; | 5645 return rc; |
| 5560 } | 5646 } |
| 5561 | 5647 |
| 5562 /* | 5648 /* |
| 5563 ** Initialize |unixFile| internals of |file| on behalf of chromiumOpen() in | 5649 ** Initialize |unixFile| internals of |file| on behalf of chromiumOpen() in |
| 5564 ** WebDatabase SQLiteFileSystemPosix.cpp. Function is a subset of unixOpen(), | 5650 ** WebDatabase SQLiteFileSystemPosix.cpp. Function is a subset of unixOpen(), |
| 5565 ** each duplicated piece is marked by "Duplicated in" comment in unixOpen(). | 5651 ** each duplicated piece is marked by "Duplicated in" comment in unixOpen(). |
| 5566 */ | 5652 */ |
| 5567 CHROMIUM_SQLITE_API | 5653 CHROMIUM_SQLITE_API |
| 5568 int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* pVfs, | 5654 int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* pVfs, |
| 5569 int fd, | 5655 int fd, |
| 5570 sqlite3_file* pFile, | 5656 sqlite3_file* pFile, |
| 5571 const char* zPath, | 5657 const char* zPath, |
| 5572 int noLock, | 5658 int noLock, |
| 5573 int flags) { | 5659 int flags) { |
| 5574 unixFile *p = (unixFile *)pFile; | 5660 unixFile *p = (unixFile *)pFile; |
| 5575 const int eType = flags&0xFFFFFF00; /* Type of file to open */ | 5661 const int eType = flags&0xFFFFFF00; /* Type of file to open */ |
| 5576 const int ctrlFlags = (noLock ? UNIXFILE_NOLOCK : 0); | 5662 const int ctrlFlags = (noLock ? UNIXFILE_NOLOCK : 0); |
| 5577 int rc; | 5663 int rc; |
| 5578 | 5664 |
| 5579 memset(p, 0, sizeof(unixFile)); | 5665 memset(p, 0, sizeof(unixFile)); |
| 5580 | 5666 |
| 5581 /* osStat() will not work in the sandbox, so findReusableFd() will always | 5667 /* osStat() will not work in the sandbox, so findReusableFd() will always |
| 5582 ** fail, so directly include the failure-case setup then initialize pUnused. | 5668 ** fail, so directly include the failure-case setup then initialize pUnused. |
| 5583 */ | 5669 */ |
| 5584 if( eType==SQLITE_OPEN_MAIN_DB ){ | 5670 if( eType==SQLITE_OPEN_MAIN_DB ){ |
| 5585 p->pUnused = sqlite3_malloc(sizeof(*p->pUnused)); | 5671 p->pUnused = sqlite3_malloc(sizeof(*p->pUnused)); |
| 5586 if (!p->pUnused) { | 5672 if (!p->pUnused) { |
| 5587 return SQLITE_NOMEM; | 5673 return SQLITE_NOMEM_BKPT; |
| 5588 } | 5674 } |
| 5589 p->pUnused->fd = fd; | 5675 p->pUnused->fd = fd; |
| 5590 p->pUnused->flags = flags; | 5676 p->pUnused->flags = flags; |
| 5591 } | 5677 } |
| 5592 | 5678 |
| 5593 rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); | 5679 rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); |
| 5594 if( rc!=SQLITE_OK ){ | 5680 if( rc!=SQLITE_OK ){ |
| 5595 sqlite3_free(p->pUnused); | 5681 sqlite3_free(p->pUnused); |
| 5596 } | 5682 } |
| 5597 return rc; | 5683 return rc; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5703 | 5789 |
| 5704 if( eType==SQLITE_OPEN_MAIN_DB ){ | 5790 if( eType==SQLITE_OPEN_MAIN_DB ){ |
| 5705 UnixUnusedFd *pUnused; | 5791 UnixUnusedFd *pUnused; |
| 5706 pUnused = findReusableFd(zName, flags); | 5792 pUnused = findReusableFd(zName, flags); |
| 5707 if( pUnused ){ | 5793 if( pUnused ){ |
| 5708 fd = pUnused->fd; | 5794 fd = pUnused->fd; |
| 5709 }else{ | 5795 }else{ |
| 5710 /* Duplicated in chromium_sqlite3_fill_in_unix_sqlite3_file(). */ | 5796 /* Duplicated in chromium_sqlite3_fill_in_unix_sqlite3_file(). */ |
| 5711 pUnused = sqlite3_malloc64(sizeof(*pUnused)); | 5797 pUnused = sqlite3_malloc64(sizeof(*pUnused)); |
| 5712 if( !pUnused ){ | 5798 if( !pUnused ){ |
| 5713 return SQLITE_NOMEM; | 5799 return SQLITE_NOMEM_BKPT; |
| 5714 } | 5800 } |
| 5715 } | 5801 } |
| 5716 p->pUnused = pUnused; | 5802 p->pUnused = pUnused; |
| 5717 | 5803 |
| 5718 /* Database filenames are double-zero terminated if they are not | 5804 /* Database filenames are double-zero terminated if they are not |
| 5719 ** URIs with parameters. Hence, they can always be passed into | 5805 ** URIs with parameters. Hence, they can always be passed into |
| 5720 ** sqlite3_uri_parameter(). */ | 5806 ** sqlite3_uri_parameter(). */ |
| 5721 assert( (flags & SQLITE_OPEN_URI) || zName[strlen(zName)+1]==0 ); | 5807 assert( (flags & SQLITE_OPEN_URI) || zName[strlen(zName)+1]==0 ); |
| 5722 | 5808 |
| 5723 }else if( !zName ){ | 5809 }else if( !zName ){ |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5790 p->pUnused->flags = flags; | 5876 p->pUnused->flags = flags; |
| 5791 } | 5877 } |
| 5792 | 5878 |
| 5793 if( isDelete ){ | 5879 if( isDelete ){ |
| 5794 #if OS_VXWORKS | 5880 #if OS_VXWORKS |
| 5795 zPath = zName; | 5881 zPath = zName; |
| 5796 #elif defined(SQLITE_UNLINK_AFTER_CLOSE) | 5882 #elif defined(SQLITE_UNLINK_AFTER_CLOSE) |
| 5797 zPath = sqlite3_mprintf("%s", zName); | 5883 zPath = sqlite3_mprintf("%s", zName); |
| 5798 if( zPath==0 ){ | 5884 if( zPath==0 ){ |
| 5799 robust_close(p, fd, __LINE__); | 5885 robust_close(p, fd, __LINE__); |
| 5800 return SQLITE_NOMEM; | 5886 return SQLITE_NOMEM_BKPT; |
| 5801 } | 5887 } |
| 5802 #else | 5888 #else |
| 5803 osUnlink(zName); | 5889 osUnlink(zName); |
| 5804 #endif | 5890 #endif |
| 5805 } | 5891 } |
| 5806 #if SQLITE_ENABLE_LOCKING_STYLE | 5892 #if SQLITE_ENABLE_LOCKING_STYLE |
| 5807 else{ | 5893 else{ |
| 5808 p->openFlags = openFlags; | 5894 p->openFlags = openFlags; |
| 5809 } | 5895 } |
| 5810 #endif | 5896 #endif |
| 5811 | |
| 5812 noLock = eType!=SQLITE_OPEN_MAIN_DB; | |
| 5813 | |
| 5814 | 5897 |
| 5815 #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE | 5898 #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE |
| 5816 if( fstatfs(fd, &fsInfo) == -1 ){ | 5899 if( fstatfs(fd, &fsInfo) == -1 ){ |
| 5817 storeLastErrno(p, errno); | 5900 storeLastErrno(p, errno); |
| 5818 robust_close(p, fd, __LINE__); | 5901 robust_close(p, fd, __LINE__); |
| 5819 return SQLITE_IOERR_ACCESS; | 5902 return SQLITE_IOERR_ACCESS; |
| 5820 } | 5903 } |
| 5821 if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) { | 5904 if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) { |
| 5822 ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; | 5905 ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; |
| 5823 } | 5906 } |
| 5824 if (0 == strncmp("exfat", fsInfo.f_fstypename, 5)) { | 5907 if (0 == strncmp("exfat", fsInfo.f_fstypename, 5)) { |
| 5825 ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; | 5908 ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; |
| 5826 } | 5909 } |
| 5827 #endif | 5910 #endif |
| 5828 | 5911 |
| 5829 /* Set up appropriate ctrlFlags */ | 5912 /* Set up appropriate ctrlFlags */ |
| 5830 if( isDelete ) ctrlFlags |= UNIXFILE_DELETE; | 5913 if( isDelete ) ctrlFlags |= UNIXFILE_DELETE; |
| 5831 if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY; | 5914 if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY; |
| 5915 noLock = eType!=SQLITE_OPEN_MAIN_DB; |
| 5832 if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK; | 5916 if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK; |
| 5833 if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC; | 5917 if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC; |
| 5834 if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; | 5918 if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; |
| 5835 | 5919 |
| 5836 #if SQLITE_ENABLE_LOCKING_STYLE | 5920 #if SQLITE_ENABLE_LOCKING_STYLE |
| 5837 #if SQLITE_PREFER_PROXY_LOCKING | 5921 #if SQLITE_PREFER_PROXY_LOCKING |
| 5838 isAutoProxy = 1; | 5922 isAutoProxy = 1; |
| 5839 #endif | 5923 #endif |
| 5840 if( isAutoProxy && (zPath!=NULL) && (!noLock) && pVfs->xOpen ){ | 5924 if( isAutoProxy && (zPath!=NULL) && (!noLock) && pVfs->xOpen ){ |
| 5841 char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING"); | 5925 char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING"); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5900 }else{ | 5984 }else{ |
| 5901 rc = unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); | 5985 rc = unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); |
| 5902 } | 5986 } |
| 5903 return rc; | 5987 return rc; |
| 5904 } | 5988 } |
| 5905 #ifndef SQLITE_DISABLE_DIRSYNC | 5989 #ifndef SQLITE_DISABLE_DIRSYNC |
| 5906 if( (dirSync & 1)!=0 ){ | 5990 if( (dirSync & 1)!=0 ){ |
| 5907 int fd; | 5991 int fd; |
| 5908 rc = osOpenDirectory(zPath, &fd); | 5992 rc = osOpenDirectory(zPath, &fd); |
| 5909 if( rc==SQLITE_OK ){ | 5993 if( rc==SQLITE_OK ){ |
| 5910 #if OS_VXWORKS | 5994 if( full_fsync(fd,0,0) ){ |
| 5911 if( fsync(fd)==-1 ) | |
| 5912 #else | |
| 5913 if( fsync(fd) ) | |
| 5914 #endif | |
| 5915 { | |
| 5916 rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); | 5995 rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); |
| 5917 } | 5996 } |
| 5918 robust_close(0, fd, __LINE__); | 5997 robust_close(0, fd, __LINE__); |
| 5919 }else{ | 5998 }else{ |
| 5920 assert( rc==SQLITE_CANTOPEN ); | 5999 assert( rc==SQLITE_CANTOPEN ); |
| 5921 rc = SQLITE_OK; | 6000 rc = SQLITE_OK; |
| 5922 } | 6001 } |
| 5923 } | 6002 } |
| 5924 #endif | 6003 #endif |
| 5925 return rc; | 6004 return rc; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 5951 | 6030 |
| 5952 if( flags==SQLITE_ACCESS_EXISTS ){ | 6031 if( flags==SQLITE_ACCESS_EXISTS ){ |
| 5953 struct stat buf; | 6032 struct stat buf; |
| 5954 *pResOut = (0==osStat(zPath, &buf) && buf.st_size>0); | 6033 *pResOut = (0==osStat(zPath, &buf) && buf.st_size>0); |
| 5955 }else{ | 6034 }else{ |
| 5956 *pResOut = osAccess(zPath, W_OK|R_OK)==0; | 6035 *pResOut = osAccess(zPath, W_OK|R_OK)==0; |
| 5957 } | 6036 } |
| 5958 return SQLITE_OK; | 6037 return SQLITE_OK; |
| 5959 } | 6038 } |
| 5960 | 6039 |
| 6040 /* |
| 6041 ** |
| 6042 */ |
| 6043 static int mkFullPathname( |
| 6044 const char *zPath, /* Input path */ |
| 6045 char *zOut, /* Output buffer */ |
| 6046 int nOut /* Allocated size of buffer zOut */ |
| 6047 ){ |
| 6048 int nPath = sqlite3Strlen30(zPath); |
| 6049 int iOff = 0; |
| 6050 if( zPath[0]!='/' ){ |
| 6051 if( osGetcwd(zOut, nOut-2)==0 ){ |
| 6052 return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); |
| 6053 } |
| 6054 iOff = sqlite3Strlen30(zOut); |
| 6055 zOut[iOff++] = '/'; |
| 6056 } |
| 6057 if( (iOff+nPath+1)>nOut ){ |
| 6058 /* SQLite assumes that xFullPathname() nul-terminates the output buffer |
| 6059 ** even if it returns an error. */ |
| 6060 zOut[iOff] = '\0'; |
| 6061 return SQLITE_CANTOPEN_BKPT; |
| 6062 } |
| 6063 sqlite3_snprintf(nOut-iOff, &zOut[iOff], "%s", zPath); |
| 6064 return SQLITE_OK; |
| 6065 } |
| 5961 | 6066 |
| 5962 /* | 6067 /* |
| 5963 ** Turn a relative pathname into a full pathname. The relative path | 6068 ** Turn a relative pathname into a full pathname. The relative path |
| 5964 ** is stored as a nul-terminated string in the buffer pointed to by | 6069 ** is stored as a nul-terminated string in the buffer pointed to by |
| 5965 ** zPath. | 6070 ** zPath. |
| 5966 ** | 6071 ** |
| 5967 ** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes | 6072 ** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes |
| 5968 ** (in this case, MAX_PATHNAME bytes). The full-path is written to | 6073 ** (in this case, MAX_PATHNAME bytes). The full-path is written to |
| 5969 ** this buffer before returning. | 6074 ** this buffer before returning. |
| 5970 */ | 6075 */ |
| 5971 static int unixFullPathname( | 6076 static int unixFullPathname( |
| 5972 sqlite3_vfs *pVfs, /* Pointer to vfs object */ | 6077 sqlite3_vfs *pVfs, /* Pointer to vfs object */ |
| 5973 const char *zPath, /* Possibly relative input path */ | 6078 const char *zPath, /* Possibly relative input path */ |
| 5974 int nOut, /* Size of output buffer in bytes */ | 6079 int nOut, /* Size of output buffer in bytes */ |
| 5975 char *zOut /* Output buffer */ | 6080 char *zOut /* Output buffer */ |
| 5976 ){ | 6081 ){ |
| 6082 #if !defined(HAVE_READLINK) || !defined(HAVE_LSTAT) |
| 6083 return mkFullPathname(zPath, zOut, nOut); |
| 6084 #else |
| 6085 int rc = SQLITE_OK; |
| 5977 int nByte; | 6086 int nByte; |
| 6087 int nLink = 1; /* Number of symbolic links followed so far */ |
| 6088 const char *zIn = zPath; /* Input path for each iteration of loop */ |
| 6089 char *zDel = 0; |
| 6090 |
| 6091 assert( pVfs->mxPathname==MAX_PATHNAME ); |
| 6092 UNUSED_PARAMETER(pVfs); |
| 5978 | 6093 |
| 5979 /* It's odd to simulate an io-error here, but really this is just | 6094 /* It's odd to simulate an io-error here, but really this is just |
| 5980 ** using the io-error infrastructure to test that SQLite handles this | 6095 ** using the io-error infrastructure to test that SQLite handles this |
| 5981 ** function failing. This function could fail if, for example, the | 6096 ** function failing. This function could fail if, for example, the |
| 5982 ** current working directory has been unlinked. | 6097 ** current working directory has been unlinked. |
| 5983 */ | 6098 */ |
| 5984 SimulateIOError( return SQLITE_ERROR ); | 6099 SimulateIOError( return SQLITE_ERROR ); |
| 5985 | 6100 |
| 5986 assert( pVfs->mxPathname==MAX_PATHNAME ); | 6101 do { |
| 5987 UNUSED_PARAMETER(pVfs); | |
| 5988 | 6102 |
| 5989 /* Attempt to resolve the path as if it were a symbolic link. If it is | 6103 /* Call stat() on path zIn. Set bLink to true if the path is a symbolic |
| 5990 ** a symbolic link, the resolved path is stored in buffer zOut[]. Or, if | 6104 ** link, or false otherwise. */ |
| 5991 ** the identified file is not a symbolic link or does not exist, then | 6105 int bLink = 0; |
| 5992 ** zPath is copied directly into zOut. Either way, nByte is left set to | 6106 struct stat buf; |
| 5993 ** the size of the string copied into zOut[] in bytes. */ | 6107 if( osLstat(zIn, &buf)!=0 ){ |
| 5994 nByte = osReadlink(zPath, zOut, nOut-1); | 6108 if( errno!=ENOENT ){ |
| 5995 if( nByte<0 ){ | 6109 rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); |
| 5996 if( errno!=EINVAL && errno!=ENOENT ){ | 6110 } |
| 5997 return unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zPath); | 6111 }else{ |
| 6112 bLink = S_ISLNK(buf.st_mode); |
| 5998 } | 6113 } |
| 5999 sqlite3_snprintf(nOut, zOut, "%s", zPath); | |
| 6000 nByte = sqlite3Strlen30(zOut); | |
| 6001 }else{ | |
| 6002 zOut[nByte] = '\0'; | |
| 6003 } | |
| 6004 | 6114 |
| 6005 /* If buffer zOut[] now contains an absolute path there is nothing more | 6115 if( bLink ){ |
| 6006 ** to do. If it contains a relative path, do the following: | 6116 if( zDel==0 ){ |
| 6007 ** | 6117 zDel = sqlite3_malloc(nOut); |
| 6008 ** * move the relative path string so that it is at the end of th | 6118 if( zDel==0 ) rc = SQLITE_NOMEM_BKPT; |
| 6009 ** zOut[] buffer. | 6119 }else if( ++nLink>SQLITE_MAX_SYMLINKS ){ |
| 6010 ** * Call getcwd() to read the path of the current working directory | 6120 rc = SQLITE_CANTOPEN_BKPT; |
| 6011 ** into the start of the zOut[] buffer. | 6121 } |
| 6012 ** * Append a '/' character to the cwd string and move the | 6122 |
| 6013 ** relative path back within the buffer so that it immediately | 6123 if( rc==SQLITE_OK ){ |
| 6014 ** follows the '/'. | 6124 nByte = osReadlink(zIn, zDel, nOut-1); |
| 6015 ** | 6125 if( nByte<0 ){ |
| 6016 ** This code is written so that if the combination of the CWD and relative | 6126 rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn); |
| 6017 ** path are larger than the allocated size of zOut[] the CWD is silently | 6127 }else{ |
| 6018 ** truncated to make it fit. This is Ok, as SQLite refuses to open any | 6128 if( zDel[0]!='/' ){ |
| 6019 ** file for which this function returns a full path larger than (nOut-8) | 6129 int n; |
| 6020 ** bytes in size. */ | 6130 for(n = sqlite3Strlen30(zIn); n>0 && zIn[n-1]!='/'; n--); |
| 6021 testcase( nByte==nOut-5 ); | 6131 if( nByte+n+1>nOut ){ |
| 6022 testcase( nByte==nOut-4 ); | 6132 rc = SQLITE_CANTOPEN_BKPT; |
| 6023 if( zOut[0]!='/' && nByte<nOut-4 ){ | 6133 }else{ |
| 6024 int nCwd; | 6134 memmove(&zDel[n], zDel, nByte+1); |
| 6025 int nRem = nOut-nByte-1; | 6135 memcpy(zDel, zIn, n); |
| 6026 memmove(&zOut[nRem], zOut, nByte+1); | 6136 nByte += n; |
| 6027 zOut[nRem-1] = '\0'; | 6137 } |
| 6028 if( osGetcwd(zOut, nRem-1)==0 ){ | 6138 } |
| 6029 return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); | 6139 zDel[nByte] = '\0'; |
| 6140 } |
| 6141 } |
| 6142 |
| 6143 zIn = zDel; |
| 6030 } | 6144 } |
| 6031 nCwd = sqlite3Strlen30(zOut); | |
| 6032 assert( nCwd<=nRem-1 ); | |
| 6033 zOut[nCwd] = '/'; | |
| 6034 memmove(&zOut[nCwd+1], &zOut[nRem], nByte+1); | |
| 6035 } | |
| 6036 | 6145 |
| 6037 return SQLITE_OK; | 6146 assert( rc!=SQLITE_OK || zIn!=zOut || zIn[0]=='/' ); |
| 6147 if( rc==SQLITE_OK && zIn!=zOut ){ |
| 6148 rc = mkFullPathname(zIn, zOut, nOut); |
| 6149 } |
| 6150 if( bLink==0 ) break; |
| 6151 zIn = zOut; |
| 6152 }while( rc==SQLITE_OK ); |
| 6153 |
| 6154 sqlite3_free(zDel); |
| 6155 return rc; |
| 6156 #endif /* HAVE_READLINK && HAVE_LSTAT */ |
| 6038 } | 6157 } |
| 6039 | 6158 |
| 6040 | 6159 |
| 6041 #ifndef SQLITE_OMIT_LOAD_EXTENSION | 6160 #ifndef SQLITE_OMIT_LOAD_EXTENSION |
| 6042 /* | 6161 /* |
| 6043 ** Interfaces for opening a shared library, finding entry points | 6162 ** Interfaces for opening a shared library, finding entry points |
| 6044 ** within the shared library, and closing the shared library. | 6163 ** within the shared library, and closing the shared library. |
| 6045 */ | 6164 */ |
| 6046 #include <dlfcn.h> | 6165 #include <dlfcn.h> |
| 6047 static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){ | 6166 static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){ |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6227 int rc; | 6346 int rc; |
| 6228 UNUSED_PARAMETER(NotUsed); | 6347 UNUSED_PARAMETER(NotUsed); |
| 6229 rc = unixCurrentTimeInt64(0, &i); | 6348 rc = unixCurrentTimeInt64(0, &i); |
| 6230 *prNow = i/86400000.0; | 6349 *prNow = i/86400000.0; |
| 6231 return rc; | 6350 return rc; |
| 6232 } | 6351 } |
| 6233 #else | 6352 #else |
| 6234 # define unixCurrentTime 0 | 6353 # define unixCurrentTime 0 |
| 6235 #endif | 6354 #endif |
| 6236 | 6355 |
| 6237 #ifndef SQLITE_OMIT_DEPRECATED | |
| 6238 /* | 6356 /* |
| 6239 ** We added the xGetLastError() method with the intention of providing | 6357 ** The xGetLastError() method is designed to return a better |
| 6240 ** better low-level error messages when operating-system problems come up | 6358 ** low-level error message when operating-system problems come up |
| 6241 ** during SQLite operation. But so far, none of that has been implemented | 6359 ** during SQLite operation. Only the integer return code is currently |
| 6242 ** in the core. So this routine is never called. For now, it is merely | 6360 ** used. |
| 6243 ** a place-holder. | |
| 6244 */ | 6361 */ |
| 6245 static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ | 6362 static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ |
| 6246 UNUSED_PARAMETER(NotUsed); | 6363 UNUSED_PARAMETER(NotUsed); |
| 6247 UNUSED_PARAMETER(NotUsed2); | 6364 UNUSED_PARAMETER(NotUsed2); |
| 6248 UNUSED_PARAMETER(NotUsed3); | 6365 UNUSED_PARAMETER(NotUsed3); |
| 6249 return 0; | 6366 return errno; |
| 6250 } | 6367 } |
| 6251 #else | |
| 6252 # define unixGetLastError 0 | |
| 6253 #endif | |
| 6254 | 6368 |
| 6255 | 6369 |
| 6256 /* | 6370 /* |
| 6257 ************************ End of sqlite3_vfs methods *************************** | 6371 ************************ End of sqlite3_vfs methods *************************** |
| 6258 ******************************************************************************/ | 6372 ******************************************************************************/ |
| 6259 | 6373 |
| 6260 /****************************************************************************** | 6374 /****************************************************************************** |
| 6261 ************************** Begin Proxy Locking ******************************** | 6375 ************************** Begin Proxy Locking ******************************** |
| 6262 ** | 6376 ** |
| 6263 ** Proxy locking is a "uber-locking-method" in this sense: It uses the | 6377 ** Proxy locking is a "uber-locking-method" in this sense: It uses the |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6533 ** the parent directories and then try again. | 6647 ** the parent directories and then try again. |
| 6534 ** 3. if that fails, try to open the file read-only | 6648 ** 3. if that fails, try to open the file read-only |
| 6535 ** otherwise return BUSY (if lock file) or CANTOPEN for the conch file | 6649 ** otherwise return BUSY (if lock file) or CANTOPEN for the conch file |
| 6536 */ | 6650 */ |
| 6537 pUnused = findReusableFd(path, openFlags); | 6651 pUnused = findReusableFd(path, openFlags); |
| 6538 if( pUnused ){ | 6652 if( pUnused ){ |
| 6539 fd = pUnused->fd; | 6653 fd = pUnused->fd; |
| 6540 }else{ | 6654 }else{ |
| 6541 pUnused = sqlite3_malloc64(sizeof(*pUnused)); | 6655 pUnused = sqlite3_malloc64(sizeof(*pUnused)); |
| 6542 if( !pUnused ){ | 6656 if( !pUnused ){ |
| 6543 return SQLITE_NOMEM; | 6657 return SQLITE_NOMEM_BKPT; |
| 6544 } | 6658 } |
| 6545 } | 6659 } |
| 6546 if( fd<0 ){ | 6660 if( fd<0 ){ |
| 6547 fd = robust_open(path, openFlags, 0); | 6661 fd = robust_open(path, openFlags, 0); |
| 6548 terrno = errno; | 6662 terrno = errno; |
| 6549 if( fd<0 && errno==ENOENT && islockfile ){ | 6663 if( fd<0 && errno==ENOENT && islockfile ){ |
| 6550 if( proxyCreateLockPath(path) == SQLITE_OK ){ | 6664 if( proxyCreateLockPath(path) == SQLITE_OK ){ |
| 6551 fd = robust_open(path, openFlags, 0); | 6665 fd = robust_open(path, openFlags, 0); |
| 6552 } | 6666 } |
| 6553 } | 6667 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 6566 return SQLITE_PERM; | 6680 return SQLITE_PERM; |
| 6567 case EIO: | 6681 case EIO: |
| 6568 return SQLITE_IOERR_LOCK; /* even though it is the conch */ | 6682 return SQLITE_IOERR_LOCK; /* even though it is the conch */ |
| 6569 default: | 6683 default: |
| 6570 return SQLITE_CANTOPEN_BKPT; | 6684 return SQLITE_CANTOPEN_BKPT; |
| 6571 } | 6685 } |
| 6572 } | 6686 } |
| 6573 | 6687 |
| 6574 pNew = (unixFile *)sqlite3_malloc64(sizeof(*pNew)); | 6688 pNew = (unixFile *)sqlite3_malloc64(sizeof(*pNew)); |
| 6575 if( pNew==NULL ){ | 6689 if( pNew==NULL ){ |
| 6576 rc = SQLITE_NOMEM; | 6690 rc = SQLITE_NOMEM_BKPT; |
| 6577 goto end_create_proxy; | 6691 goto end_create_proxy; |
| 6578 } | 6692 } |
| 6579 memset(pNew, 0, sizeof(unixFile)); | 6693 memset(pNew, 0, sizeof(unixFile)); |
| 6580 pNew->openFlags = openFlags; | 6694 pNew->openFlags = openFlags; |
| 6581 memset(&dummyVfs, 0, sizeof(dummyVfs)); | 6695 memset(&dummyVfs, 0, sizeof(dummyVfs)); |
| 6582 dummyVfs.pAppData = (void*)&autolockIoFinder; | 6696 dummyVfs.pAppData = (void*)&autolockIoFinder; |
| 6583 dummyVfs.zName = "dummy"; | 6697 dummyVfs.zName = "dummy"; |
| 6584 pUnused->fd = fd; | 6698 pUnused->fd = fd; |
| 6585 pUnused->flags = openFlags; | 6699 pUnused->flags = openFlags; |
| 6586 pNew->pUnused = pUnused; | 6700 pNew->pUnused = pUnused; |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6909 memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); | 7023 memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); |
| 6910 if( pCtx->lockProxyPath!=NULL ){ | 7024 if( pCtx->lockProxyPath!=NULL ){ |
| 6911 strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, | 7025 strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, |
| 6912 MAXPATHLEN); | 7026 MAXPATHLEN); |
| 6913 }else{ | 7027 }else{ |
| 6914 strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAXPATHLEN); | 7028 strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAXPATHLEN); |
| 6915 } | 7029 } |
| 6916 writeSize = PROXY_PATHINDEX + strlen(&writeBuffer[PROXY_PATHINDEX]); | 7030 writeSize = PROXY_PATHINDEX + strlen(&writeBuffer[PROXY_PATHINDEX]); |
| 6917 robust_ftruncate(conchFile->h, writeSize); | 7031 robust_ftruncate(conchFile->h, writeSize); |
| 6918 rc = unixWrite((sqlite3_file *)conchFile, writeBuffer, writeSize, 0); | 7032 rc = unixWrite((sqlite3_file *)conchFile, writeBuffer, writeSize, 0); |
| 6919 fsync(conchFile->h); | 7033 full_fsync(conchFile->h,0,0); |
| 6920 /* If we created a new conch file (not just updated the contents of a | 7034 /* If we created a new conch file (not just updated the contents of a |
| 6921 ** valid conch file), try to match the permissions of the database | 7035 ** valid conch file), try to match the permissions of the database |
| 6922 */ | 7036 */ |
| 6923 if( rc==SQLITE_OK && createConch ){ | 7037 if( rc==SQLITE_OK && createConch ){ |
| 6924 struct stat buf; | 7038 struct stat buf; |
| 6925 int err = osFstat(pFile->h, &buf); | 7039 int err = osFstat(pFile->h, &buf); |
| 6926 if( err==0 ){ | 7040 if( err==0 ){ |
| 6927 mode_t cmode = buf.st_mode&(S_IRUSR|S_IWUSR | S_IRGRP|S_IWGRP | | 7041 mode_t cmode = buf.st_mode&(S_IRUSR|S_IWUSR | S_IRGRP|S_IWGRP | |
| 6928 S_IROTH|S_IWOTH); | 7042 S_IROTH|S_IWOTH); |
| 6929 /* try to match the database file R/W permissions, ignore failure */ | 7043 /* try to match the database file R/W permissions, ignore failure */ |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6979 continue; /* go back to the do {} while start point, try again */ | 7093 continue; /* go back to the do {} while start point, try again */ |
| 6980 } | 7094 } |
| 6981 } | 7095 } |
| 6982 if( rc==SQLITE_OK ){ | 7096 if( rc==SQLITE_OK ){ |
| 6983 /* Need to make a copy of path if we extracted the value | 7097 /* Need to make a copy of path if we extracted the value |
| 6984 ** from the conch file or the path was allocated on the stack | 7098 ** from the conch file or the path was allocated on the stack |
| 6985 */ | 7099 */ |
| 6986 if( tempLockPath ){ | 7100 if( tempLockPath ){ |
| 6987 pCtx->lockProxyPath = sqlite3DbStrDup(0, tempLockPath); | 7101 pCtx->lockProxyPath = sqlite3DbStrDup(0, tempLockPath); |
| 6988 if( !pCtx->lockProxyPath ){ | 7102 if( !pCtx->lockProxyPath ){ |
| 6989 rc = SQLITE_NOMEM; | 7103 rc = SQLITE_NOMEM_BKPT; |
| 6990 } | 7104 } |
| 6991 } | 7105 } |
| 6992 } | 7106 } |
| 6993 if( rc==SQLITE_OK ){ | 7107 if( rc==SQLITE_OK ){ |
| 6994 pCtx->conchHeld = 1; | 7108 pCtx->conchHeld = 1; |
| 6995 | 7109 |
| 6996 if( pCtx->lockProxy->pMethod == &afpIoMethods ){ | 7110 if( pCtx->lockProxy->pMethod == &afpIoMethods ){ |
| 6997 afpLockingContext *afpCtx; | 7111 afpLockingContext *afpCtx; |
| 6998 afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext; | 7112 afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext; |
| 6999 afpCtx->dbPath = pCtx->lockProxyPath; | 7113 afpCtx->dbPath = pCtx->lockProxyPath; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7044 */ | 7158 */ |
| 7045 static int proxyCreateConchPathname(char *dbPath, char **pConchPath){ | 7159 static int proxyCreateConchPathname(char *dbPath, char **pConchPath){ |
| 7046 int i; /* Loop counter */ | 7160 int i; /* Loop counter */ |
| 7047 int len = (int)strlen(dbPath); /* Length of database filename - dbPath */ | 7161 int len = (int)strlen(dbPath); /* Length of database filename - dbPath */ |
| 7048 char *conchPath; /* buffer in which to construct conch name */ | 7162 char *conchPath; /* buffer in which to construct conch name */ |
| 7049 | 7163 |
| 7050 /* Allocate space for the conch filename and initialize the name to | 7164 /* Allocate space for the conch filename and initialize the name to |
| 7051 ** the name of the original database file. */ | 7165 ** the name of the original database file. */ |
| 7052 *pConchPath = conchPath = (char *)sqlite3_malloc64(len + 8); | 7166 *pConchPath = conchPath = (char *)sqlite3_malloc64(len + 8); |
| 7053 if( conchPath==0 ){ | 7167 if( conchPath==0 ){ |
| 7054 return SQLITE_NOMEM; | 7168 return SQLITE_NOMEM_BKPT; |
| 7055 } | 7169 } |
| 7056 memcpy(conchPath, dbPath, len+1); | 7170 memcpy(conchPath, dbPath, len+1); |
| 7057 | 7171 |
| 7058 /* now insert a "." before the last / character */ | 7172 /* now insert a "." before the last / character */ |
| 7059 for( i=(len-1); i>=0; i-- ){ | 7173 for( i=(len-1); i>=0; i-- ){ |
| 7060 if( conchPath[i]=='/' ){ | 7174 if( conchPath[i]=='/' ){ |
| 7061 i++; | 7175 i++; |
| 7062 break; | 7176 break; |
| 7063 } | 7177 } |
| 7064 } | 7178 } |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7160 lockPath=NULL; | 7274 lockPath=NULL; |
| 7161 }else{ | 7275 }else{ |
| 7162 lockPath=(char *)path; | 7276 lockPath=(char *)path; |
| 7163 } | 7277 } |
| 7164 | 7278 |
| 7165 OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h, | 7279 OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h, |
| 7166 (lockPath ? lockPath : ":auto:"), osGetpid(0))); | 7280 (lockPath ? lockPath : ":auto:"), osGetpid(0))); |
| 7167 | 7281 |
| 7168 pCtx = sqlite3_malloc64( sizeof(*pCtx) ); | 7282 pCtx = sqlite3_malloc64( sizeof(*pCtx) ); |
| 7169 if( pCtx==0 ){ | 7283 if( pCtx==0 ){ |
| 7170 return SQLITE_NOMEM; | 7284 return SQLITE_NOMEM_BKPT; |
| 7171 } | 7285 } |
| 7172 memset(pCtx, 0, sizeof(*pCtx)); | 7286 memset(pCtx, 0, sizeof(*pCtx)); |
| 7173 | 7287 |
| 7174 rc = proxyCreateConchPathname(dbPath, &pCtx->conchFilePath); | 7288 rc = proxyCreateConchPathname(dbPath, &pCtx->conchFilePath); |
| 7175 if( rc==SQLITE_OK ){ | 7289 if( rc==SQLITE_OK ){ |
| 7176 rc = proxyCreateUnixFile(pCtx->conchFilePath, &pCtx->conchFile, 0); | 7290 rc = proxyCreateUnixFile(pCtx->conchFilePath, &pCtx->conchFile, 0); |
| 7177 if( rc==SQLITE_CANTOPEN && ((pFile->openFlags&O_RDWR) == 0) ){ | 7291 if( rc==SQLITE_CANTOPEN && ((pFile->openFlags&O_RDWR) == 0) ){ |
| 7178 /* if (a) the open flags are not O_RDWR, (b) the conch isn't there, and | 7292 /* if (a) the open flags are not O_RDWR, (b) the conch isn't there, and |
| 7179 ** (c) the file system is read-only, then enable no-locking access. | 7293 ** (c) the file system is read-only, then enable no-locking access. |
| 7180 ** Ugh, since O_RDONLY==0x0000 we test for !O_RDWR since unixOpen asserts | 7294 ** Ugh, since O_RDONLY==0x0000 we test for !O_RDWR since unixOpen asserts |
| (...skipping 15 matching lines...) Expand all Loading... |
| 7196 } | 7310 } |
| 7197 } | 7311 } |
| 7198 } | 7312 } |
| 7199 if( rc==SQLITE_OK && lockPath ){ | 7313 if( rc==SQLITE_OK && lockPath ){ |
| 7200 pCtx->lockProxyPath = sqlite3DbStrDup(0, lockPath); | 7314 pCtx->lockProxyPath = sqlite3DbStrDup(0, lockPath); |
| 7201 } | 7315 } |
| 7202 | 7316 |
| 7203 if( rc==SQLITE_OK ){ | 7317 if( rc==SQLITE_OK ){ |
| 7204 pCtx->dbPath = sqlite3DbStrDup(0, dbPath); | 7318 pCtx->dbPath = sqlite3DbStrDup(0, dbPath); |
| 7205 if( pCtx->dbPath==NULL ){ | 7319 if( pCtx->dbPath==NULL ){ |
| 7206 rc = SQLITE_NOMEM; | 7320 rc = SQLITE_NOMEM_BKPT; |
| 7207 } | 7321 } |
| 7208 } | 7322 } |
| 7209 if( rc==SQLITE_OK ){ | 7323 if( rc==SQLITE_OK ){ |
| 7210 /* all memory is allocated, proxys are created and assigned, | 7324 /* all memory is allocated, proxys are created and assigned, |
| 7211 ** switch the locking context and pMethod then return. | 7325 ** switch the locking context and pMethod then return. |
| 7212 */ | 7326 */ |
| 7213 pCtx->oldLockingContext = pFile->lockingContext; | 7327 pCtx->oldLockingContext = pFile->lockingContext; |
| 7214 pFile->lockingContext = pCtx; | 7328 pFile->lockingContext = pCtx; |
| 7215 pCtx->pOldMethod = pFile->pMethod; | 7329 pCtx->pOldMethod = pFile->pMethod; |
| 7216 pFile->pMethod = &proxyIoMethods; | 7330 pFile->pMethod = &proxyIoMethods; |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7526 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) | 7640 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) |
| 7527 UNIXVFS("unix-afp", afpIoFinder ), | 7641 UNIXVFS("unix-afp", afpIoFinder ), |
| 7528 UNIXVFS("unix-nfs", nfsIoFinder ), | 7642 UNIXVFS("unix-nfs", nfsIoFinder ), |
| 7529 UNIXVFS("unix-proxy", proxyIoFinder ), | 7643 UNIXVFS("unix-proxy", proxyIoFinder ), |
| 7530 #endif | 7644 #endif |
| 7531 }; | 7645 }; |
| 7532 unsigned int i; /* Loop counter */ | 7646 unsigned int i; /* Loop counter */ |
| 7533 | 7647 |
| 7534 /* Double-check that the aSyscall[] array has been constructed | 7648 /* Double-check that the aSyscall[] array has been constructed |
| 7535 ** correctly. See ticket [bb3a86e890c8e96ab] */ | 7649 ** correctly. See ticket [bb3a86e890c8e96ab] */ |
| 7536 assert( ArraySize(aSyscall)==27 ); | 7650 assert( ArraySize(aSyscall)==28 ); |
| 7537 | 7651 |
| 7538 /* Register all VFSes defined in the aVfs[] array */ | 7652 /* Register all VFSes defined in the aVfs[] array */ |
| 7539 for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ | 7653 for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ |
| 7540 sqlite3_vfs_register(&aVfs[i], i==0); | 7654 sqlite3_vfs_register(&aVfs[i], i==0); |
| 7541 } | 7655 } |
| 7542 return SQLITE_OK; | 7656 return SQLITE_OK; |
| 7543 } | 7657 } |
| 7544 | 7658 |
| 7545 /* | 7659 /* |
| 7546 ** Shutdown the operating system interface. | 7660 ** Shutdown the operating system interface. |
| 7547 ** | 7661 ** |
| 7548 ** Some operating systems might need to do some cleanup in this routine, | 7662 ** Some operating systems might need to do some cleanup in this routine, |
| 7549 ** to release dynamically allocated objects. But not on unix. | 7663 ** to release dynamically allocated objects. But not on unix. |
| 7550 ** This routine is a no-op for unix. | 7664 ** This routine is a no-op for unix. |
| 7551 */ | 7665 */ |
| 7552 int sqlite3_os_end(void){ | 7666 int sqlite3_os_end(void){ |
| 7553 return SQLITE_OK; | 7667 return SQLITE_OK; |
| 7554 } | 7668 } |
| 7555 | 7669 |
| 7556 #endif /* SQLITE_OS_UNIX */ | 7670 #endif /* SQLITE_OS_UNIX */ |
| OLD | NEW |