1 /* 2 ** 2005 November 29 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ****************************************************************************** 12 ** 13 ** This file contains OS interface code that is common to all 14 ** architectures. 15 */ 16 #define _SQLITE_OS_C_ 1 17 #include "sqliteInt.h" 18 #undef _SQLITE_OS_C_ 19 20 /* 21 ** If we compile with the SQLITE_TEST macro set, then the following block 22 ** of code will give us the ability to simulate a disk I/O error. This 23 ** is used for testing the I/O recovery logic. 24 */ 25 #if defined(SQLITE_TEST) 26 int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */ 27 int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */ 28 int sqlite3_io_error_pending = 0; /* Count down to first I/O error */ 29 int sqlite3_io_error_persist = 0; /* True if I/O errors persist */ 30 int sqlite3_io_error_benign = 0; /* True if errors are benign */ 31 int sqlite3_diskfull_pending = 0; 32 int sqlite3_diskfull = 0; 33 #endif /* defined(SQLITE_TEST) */ 34 35 /* 36 ** When testing, also keep a count of the number of open files. 37 */ 38 #if defined(SQLITE_TEST) 39 int sqlite3_open_file_count = 0; 40 #endif /* defined(SQLITE_TEST) */ 41 42 /* 43 ** The default SQLite sqlite3_vfs implementations do not allocate 44 ** memory (actually, os_unix.c allocates a small amount of memory 45 ** from within OsOpen()), but some third-party implementations may. 46 ** So we test the effects of a malloc() failing and the sqlite3OsXXX() 47 ** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro. 48 ** 49 ** The following functions are instrumented for malloc() failure 50 ** testing: 51 ** 52 ** sqlite3OsRead() 53 ** sqlite3OsWrite() 54 ** sqlite3OsSync() 55 ** sqlite3OsFileSize() 56 ** sqlite3OsLock() 57 ** sqlite3OsCheckReservedLock() 58 ** sqlite3OsFileControl() 59 ** sqlite3OsShmMap() 60 ** sqlite3OsOpen() 61 ** sqlite3OsDelete() 62 ** sqlite3OsAccess() 63 ** sqlite3OsFullPathname() 64 ** 65 */ 66 #if defined(SQLITE_TEST) 67 int sqlite3_memdebug_vfs_oom_test = 1; 68 #define DO_OS_MALLOC_TEST(x) \ 69 if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3IsMemJournal(x))) { \ 70 void *pTstAlloc = sqlite3Malloc(10); \ 71 if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \ 72 sqlite3_free(pTstAlloc); \ 73 } 74 #else 75 #define DO_OS_MALLOC_TEST(x) 76 #endif 77 78 /* 79 ** The following routines are convenience wrappers around methods 80 ** of the sqlite3_file object. This is mostly just syntactic sugar. All 81 ** of this would be completely automatic if SQLite were coded using 82 ** C++ instead of plain old C. 83 */ 84 int sqlite3OsClose(sqlite3_file *pId){ 85 int rc = SQLITE_OK; 86 if( pId->pMethods ){ 87 rc = pId->pMethods->xClose(pId); 88 pId->pMethods = 0; 89 } 90 return rc; 91 } 92 int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ 93 DO_OS_MALLOC_TEST(id); 94 return id->pMethods->xRead(id, pBuf, amt, offset); 95 } 96 int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ 97 DO_OS_MALLOC_TEST(id); 98 return id->pMethods->xWrite(id, pBuf, amt, offset); 99 } 100 int sqlite3OsTruncate(sqlite3_file *id, i64 size){ 101 return id->pMethods->xTruncate(id, size); 102 } 103 int sqlite3OsSync(sqlite3_file *id, int flags){ 104 DO_OS_MALLOC_TEST(id); 105 return id->pMethods->xSync(id, flags); 106 } 107 int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){ 108 DO_OS_MALLOC_TEST(id); 109 return id->pMethods->xFileSize(id, pSize); 110 } 111 int sqlite3OsLock(sqlite3_file *id, int lockType){ 112 DO_OS_MALLOC_TEST(id); 113 return id->pMethods->xLock(id, lockType); 114 } 115 int sqlite3OsUnlock(sqlite3_file *id, int lockType){ 116 return id->pMethods->xUnlock(id, lockType); 117 } 118 int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ 119 DO_OS_MALLOC_TEST(id); 120 return id->pMethods->xCheckReservedLock(id, pResOut); 121 } 122 123 /* 124 ** Use sqlite3OsFileControl() when we are doing something that might fail 125 ** and we need to know about the failures. Use sqlite3OsFileControlHint() 126 ** when simply tossing information over the wall to the VFS and we do not 127 ** really care if the VFS receives and understands the information since it 128 ** is only a hint and can be safely ignored. The sqlite3OsFileControlHint() 129 ** routine has no return value since the return value would be meaningless. 130 */ 131 int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ 132 #ifdef SQLITE_TEST 133 if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){ 134 /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite 135 ** is using a regular VFS, it is called after the corresponding 136 ** transaction has been committed. Injecting a fault at this point 137 ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM 138 ** but the transaction is committed anyway. 139 ** 140 ** The core must call OsFileControl() though, not OsFileControlHint(), 141 ** as if a custom VFS (e.g. zipvfs) returns an error here, it probably 142 ** means the commit really has failed and an error should be returned 143 ** to the user. */ 144 DO_OS_MALLOC_TEST(id); 145 } 146 #endif 147 return id->pMethods->xFileControl(id, op, pArg); 148 } 149 void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ 150 (void)id->pMethods->xFileControl(id, op, pArg); 151 } 152 153 int sqlite3OsSectorSize(sqlite3_file *id){ 154 int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; 155 return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); 156 } 157 int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ 158 return id->pMethods->xDeviceCharacteristics(id); 159 } 160 int sqlite3OsShmLock(sqlite3_file *id, int offset, int n, int flags){ 161 return id->pMethods->xShmLock(id, offset, n, flags); 162 } 163 void sqlite3OsShmBarrier(sqlite3_file *id){ 164 id->pMethods->xShmBarrier(id); 165 } 166 int sqlite3OsShmUnmap(sqlite3_file *id, int deleteFlag){ 167 return id->pMethods->xShmUnmap(id, deleteFlag); 168 } 169 int sqlite3OsShmMap( 170 sqlite3_file *id, /* Database file handle */ 171 int iPage, 172 int pgsz, 173 int bExtend, /* True to extend file if necessary */ 174 void volatile **pp /* OUT: Pointer to mapping */ 175 ){ 176 DO_OS_MALLOC_TEST(id); 177 return id->pMethods->xShmMap(id, iPage, pgsz, bExtend, pp); 178 } 179 180 #if SQLITE_MAX_MMAP_SIZE>0 181 /* The real implementation of xFetch and xUnfetch */ 182 int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ 183 DO_OS_MALLOC_TEST(id); 184 return id->pMethods->xFetch(id, iOff, iAmt, pp); 185 } 186 int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ 187 return id->pMethods->xUnfetch(id, iOff, p); 188 } 189 #else 190 /* No-op stubs to use when memory-mapped I/O is disabled */ 191 int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ 192 *pp = 0; 193 return SQLITE_OK; 194 } 195 int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ 196 return SQLITE_OK; 197 } 198 #endif 199 200 /* 201 ** The next group of routines are convenience wrappers around the 202 ** VFS methods. 203 */ 204 int sqlite3OsOpen( 205 sqlite3_vfs *pVfs, 206 const char *zPath, 207 sqlite3_file *pFile, 208 int flags, 209 int *pFlagsOut 210 ){ 211 int rc; 212 DO_OS_MALLOC_TEST(0); 213 /* 0x87f7f is a mask of SQLITE_OPEN_ flags that are valid to be passed 214 ** down into the VFS layer. Some SQLITE_OPEN_ flags (for example, 215 ** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before 216 ** reaching the VFS. */ 217 rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x87f7f, pFlagsOut); 218 assert( rc==SQLITE_OK || pFile->pMethods==0 ); 219 return rc; 220 } 221 int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ 222 DO_OS_MALLOC_TEST(0); 223 assert( dirSync==0 || dirSync==1 ); 224 return pVfs->xDelete(pVfs, zPath, dirSync); 225 } 226 int sqlite3OsAccess( 227 sqlite3_vfs *pVfs, 228 const char *zPath, 229 int flags, 230 int *pResOut 231 ){ 232 DO_OS_MALLOC_TEST(0); 233 return pVfs->xAccess(pVfs, zPath, flags, pResOut); 234 } 235 int sqlite3OsFullPathname( 236 sqlite3_vfs *pVfs, 237 const char *zPath, 238 int nPathOut, 239 char *zPathOut 240 ){ 241 DO_OS_MALLOC_TEST(0); 242 zPathOut[0] = 0; 243 return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); 244 } 245 #ifndef SQLITE_OMIT_LOAD_EXTENSION 246 void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ 247 return pVfs->xDlOpen(pVfs, zPath); 248 } 249 void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 250 pVfs->xDlError(pVfs, nByte, zBufOut); 251 } 252 void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){ 253 return pVfs->xDlSym(pVfs, pHdle, zSym); 254 } 255 void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ 256 pVfs->xDlClose(pVfs, pHandle); 257 } 258 #endif /* SQLITE_OMIT_LOAD_EXTENSION */ 259 int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 260 return pVfs->xRandomness(pVfs, nByte, zBufOut); 261 } 262 int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ 263 return pVfs->xSleep(pVfs, nMicro); 264 } 265 int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){ 266 int rc; 267 /* IMPLEMENTATION-OF: R-49045-42493 SQLite will use the xCurrentTimeInt64() 268 ** method to get the current date and time if that method is available 269 ** (if iVersion is 2 or greater and the function pointer is not NULL) and 270 ** will fall back to xCurrentTime() if xCurrentTimeInt64() is 271 ** unavailable. 272 */ 273 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ 274 rc = pVfs->xCurrentTimeInt64(pVfs, pTimeOut); 275 }else{ 276 double r; 277 rc = pVfs->xCurrentTime(pVfs, &r); 278 *pTimeOut = (sqlite3_int64)(r*86400000.0); 279 } 280 return rc; 281 } 282 283 int sqlite3OsOpenMalloc( 284 sqlite3_vfs *pVfs, 285 const char *zFile, 286 sqlite3_file **ppFile, 287 int flags, 288 int *pOutFlags 289 ){ 290 int rc = SQLITE_NOMEM; 291 sqlite3_file *pFile; 292 pFile = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile); 293 if( pFile ){ 294 rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); 295 if( rc!=SQLITE_OK ){ 296 sqlite3_free(pFile); 297 }else{ 298 *ppFile = pFile; 299 } 300 } 301 return rc; 302 } 303 int sqlite3OsCloseFree(sqlite3_file *pFile){ 304 int rc = SQLITE_OK; 305 assert( pFile ); 306 rc = sqlite3OsClose(pFile); 307 sqlite3_free(pFile); 308 return rc; 309 } 310 311 /* 312 ** This function is a wrapper around the OS specific implementation of 313 ** sqlite3_os_init(). The purpose of the wrapper is to provide the 314 ** ability to simulate a malloc failure, so that the handling of an 315 ** error in sqlite3_os_init() by the upper layers can be tested. 316 */ 317 int sqlite3OsInit(void){ 318 void *p = sqlite3_malloc(10); 319 if( p==0 ) return SQLITE_NOMEM; 320 sqlite3_free(p); 321 return sqlite3_os_init(); 322 } 323 324 /* 325 ** The list of all registered VFS implementations. 326 */ 327 static sqlite3_vfs * SQLITE_WSD vfsList = 0; 328 #define vfsList GLOBAL(sqlite3_vfs *, vfsList) 329 330 /* 331 ** Locate a VFS by name. If no name is given, simply return the 332 ** first VFS on the list. 333 */ 334 sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){ 335 sqlite3_vfs *pVfs = 0; 336 #if SQLITE_THREADSAFE 337 sqlite3_mutex *mutex; 338 #endif 339 #ifndef SQLITE_OMIT_AUTOINIT 340 int rc = sqlite3_initialize(); 341 if( rc ) return 0; 342 #endif 343 #if SQLITE_THREADSAFE 344 mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); 345 #endif 346 sqlite3_mutex_enter(mutex); 347 for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){ 348 if( zVfs==0 ) break; 349 if( strcmp(zVfs, pVfs->zName)==0 ) break; 350 } 351 sqlite3_mutex_leave(mutex); 352 return pVfs; 353 } 354 355 /* 356 ** Unlink a VFS from the linked list 357 */ 358 static void vfsUnlink(sqlite3_vfs *pVfs){ 359 assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) ); 360 if( pVfs==0 ){ 361 /* No-op */ 362 }else if( vfsList==pVfs ){ 363 vfsList = pVfs->pNext; 364 }else if( vfsList ){ 365 sqlite3_vfs *p = vfsList; 366 while( p->pNext && p->pNext!=pVfs ){ 367 p = p->pNext; 368 } 369 if( p->pNext==pVfs ){ 370 p->pNext = pVfs->pNext; 371 } 372 } 373 } 374 375 /* 376 ** Register a VFS with the system. It is harmless to register the same 377 ** VFS multiple times. The new VFS becomes the default if makeDflt is 378 ** true. 379 */ 380 int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ 381 MUTEX_LOGIC(sqlite3_mutex *mutex;) 382 #ifndef SQLITE_OMIT_AUTOINIT 383 int rc = sqlite3_initialize(); 384 if( rc ) return rc; 385 #endif 386 #ifdef SQLITE_ENABLE_API_ARMOR 387 if( pVfs==0 ) return SQLITE_MISUSE_BKPT; 388 #endif 389 390 MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) 391 sqlite3_mutex_enter(mutex); 392 vfsUnlink(pVfs); 393 if( makeDflt || vfsList==0 ){ 394 pVfs->pNext = vfsList; 395 vfsList = pVfs; 396 }else{ 397 pVfs->pNext = vfsList->pNext; 398 vfsList->pNext = pVfs; 399 } 400 assert(vfsList); 401 sqlite3_mutex_leave(mutex); 402 return SQLITE_OK; 403 } 404 405 /* 406 ** Unregister a VFS so that it is no longer accessible. 407 */ 408 int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ 409 #if SQLITE_THREADSAFE 410 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); 411 #endif 412 sqlite3_mutex_enter(mutex); 413 vfsUnlink(pVfs); 414 sqlite3_mutex_leave(mutex); 415 return SQLITE_OK; 416 } 417