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 ** The default SQLite sqlite3_vfs implementations do not allocate 22 ** memory (actually, os_unix.c allocates a small amount of memory 23 ** from within OsOpen()), but some third-party implementations may. 24 ** So we test the effects of a malloc() failing and the sqlite3OsXXX() 25 ** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro. 26 ** 27 ** The following functions are instrumented for malloc() failure 28 ** testing: 29 ** 30 ** sqlite3OsOpen() 31 ** sqlite3OsRead() 32 ** sqlite3OsWrite() 33 ** sqlite3OsSync() 34 ** sqlite3OsLock() 35 ** 36 */ 37 #if defined(SQLITE_TEST) 38 int sqlite3_memdebug_vfs_oom_test = 1; 39 #define DO_OS_MALLOC_TEST(x) \ 40 if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3IsMemJournal(x))) { \ 41 void *pTstAlloc = sqlite3Malloc(10); \ 42 if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \ 43 sqlite3_free(pTstAlloc); \ 44 } 45 #else 46 #define DO_OS_MALLOC_TEST(x) 47 #endif 48 49 /* 50 ** The following routines are convenience wrappers around methods 51 ** of the sqlite3_file object. This is mostly just syntactic sugar. All 52 ** of this would be completely automatic if SQLite were coded using 53 ** C++ instead of plain old C. 54 */ 55 int sqlite3OsClose(sqlite3_file *pId){ 56 int rc = SQLITE_OK; 57 if( pId->pMethods ){ 58 rc = pId->pMethods->xClose(pId); 59 pId->pMethods = 0; 60 } 61 return rc; 62 } 63 int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ 64 DO_OS_MALLOC_TEST(id); 65 return id->pMethods->xRead(id, pBuf, amt, offset); 66 } 67 int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ 68 DO_OS_MALLOC_TEST(id); 69 return id->pMethods->xWrite(id, pBuf, amt, offset); 70 } 71 int sqlite3OsTruncate(sqlite3_file *id, i64 size){ 72 return id->pMethods->xTruncate(id, size); 73 } 74 int sqlite3OsSync(sqlite3_file *id, int flags){ 75 DO_OS_MALLOC_TEST(id); 76 return id->pMethods->xSync(id, flags); 77 } 78 int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){ 79 DO_OS_MALLOC_TEST(id); 80 return id->pMethods->xFileSize(id, pSize); 81 } 82 int sqlite3OsLock(sqlite3_file *id, int lockType){ 83 DO_OS_MALLOC_TEST(id); 84 return id->pMethods->xLock(id, lockType); 85 } 86 int sqlite3OsUnlock(sqlite3_file *id, int lockType){ 87 return id->pMethods->xUnlock(id, lockType); 88 } 89 int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ 90 DO_OS_MALLOC_TEST(id); 91 return id->pMethods->xCheckReservedLock(id, pResOut); 92 } 93 int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ 94 return id->pMethods->xFileControl(id, op, pArg); 95 } 96 int sqlite3OsSectorSize(sqlite3_file *id){ 97 int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; 98 return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); 99 } 100 int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ 101 return id->pMethods->xDeviceCharacteristics(id); 102 } 103 int sqlite3OsShmOpen(sqlite3_file *id){ 104 return id->pMethods->xShmOpen(id); 105 } 106 int sqlite3OsShmLock(sqlite3_file *id, int offset, int n, int flags){ 107 return id->pMethods->xShmLock(id, offset, n, flags); 108 } 109 void sqlite3OsShmBarrier(sqlite3_file *id){ 110 id->pMethods->xShmBarrier(id); 111 } 112 int sqlite3OsShmClose(sqlite3_file *id, int deleteFlag){ 113 return id->pMethods->xShmClose(id, deleteFlag); 114 } 115 int sqlite3OsShmMap( 116 sqlite3_file *id, 117 int iPage, 118 int pgsz, 119 int isWrite, 120 void volatile **pp 121 ){ 122 return id->pMethods->xShmMap(id, iPage, pgsz, isWrite, pp); 123 } 124 125 /* 126 ** The next group of routines are convenience wrappers around the 127 ** VFS methods. 128 */ 129 int sqlite3OsOpen( 130 sqlite3_vfs *pVfs, 131 const char *zPath, 132 sqlite3_file *pFile, 133 int flags, 134 int *pFlagsOut 135 ){ 136 int rc; 137 DO_OS_MALLOC_TEST(0); 138 /* 0x7f3f is a mask of SQLITE_OPEN_ flags that are valid to be passed 139 ** down into the VFS layer. Some SQLITE_OPEN_ flags (for example, 140 ** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before 141 ** reaching the VFS. */ 142 rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x7f3f, pFlagsOut); 143 assert( rc==SQLITE_OK || pFile->pMethods==0 ); 144 return rc; 145 } 146 int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ 147 return pVfs->xDelete(pVfs, zPath, dirSync); 148 } 149 int sqlite3OsAccess( 150 sqlite3_vfs *pVfs, 151 const char *zPath, 152 int flags, 153 int *pResOut 154 ){ 155 DO_OS_MALLOC_TEST(0); 156 return pVfs->xAccess(pVfs, zPath, flags, pResOut); 157 } 158 int sqlite3OsFullPathname( 159 sqlite3_vfs *pVfs, 160 const char *zPath, 161 int nPathOut, 162 char *zPathOut 163 ){ 164 zPathOut[0] = 0; 165 return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); 166 } 167 #ifndef SQLITE_OMIT_LOAD_EXTENSION 168 void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ 169 return pVfs->xDlOpen(pVfs, zPath); 170 } 171 void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 172 pVfs->xDlError(pVfs, nByte, zBufOut); 173 } 174 void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){ 175 return pVfs->xDlSym(pVfs, pHdle, zSym); 176 } 177 void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ 178 pVfs->xDlClose(pVfs, pHandle); 179 } 180 #endif /* SQLITE_OMIT_LOAD_EXTENSION */ 181 int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 182 return pVfs->xRandomness(pVfs, nByte, zBufOut); 183 } 184 int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ 185 return pVfs->xSleep(pVfs, nMicro); 186 } 187 int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){ 188 int rc; 189 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ 190 rc = pVfs->xCurrentTimeInt64(pVfs, pTimeOut); 191 }else{ 192 double r; 193 rc = pVfs->xCurrentTime(pVfs, &r); 194 *pTimeOut = (sqlite3_int64)(r*86400000.0); 195 } 196 return rc; 197 } 198 199 int sqlite3OsOpenMalloc( 200 sqlite3_vfs *pVfs, 201 const char *zFile, 202 sqlite3_file **ppFile, 203 int flags, 204 int *pOutFlags 205 ){ 206 int rc = SQLITE_NOMEM; 207 sqlite3_file *pFile; 208 pFile = (sqlite3_file *)sqlite3Malloc(pVfs->szOsFile); 209 if( pFile ){ 210 rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); 211 if( rc!=SQLITE_OK ){ 212 sqlite3_free(pFile); 213 }else{ 214 *ppFile = pFile; 215 } 216 } 217 return rc; 218 } 219 int sqlite3OsCloseFree(sqlite3_file *pFile){ 220 int rc = SQLITE_OK; 221 assert( pFile ); 222 rc = sqlite3OsClose(pFile); 223 sqlite3_free(pFile); 224 return rc; 225 } 226 227 /* 228 ** This function is a wrapper around the OS specific implementation of 229 ** sqlite3_os_init(). The purpose of the wrapper is to provide the 230 ** ability to simulate a malloc failure, so that the handling of an 231 ** error in sqlite3_os_init() by the upper layers can be tested. 232 */ 233 int sqlite3OsInit(void){ 234 void *p = sqlite3_malloc(10); 235 if( p==0 ) return SQLITE_NOMEM; 236 sqlite3_free(p); 237 return sqlite3_os_init(); 238 } 239 240 /* 241 ** The list of all registered VFS implementations. 242 */ 243 static sqlite3_vfs * SQLITE_WSD vfsList = 0; 244 #define vfsList GLOBAL(sqlite3_vfs *, vfsList) 245 246 /* 247 ** Locate a VFS by name. If no name is given, simply return the 248 ** first VFS on the list. 249 */ 250 sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){ 251 sqlite3_vfs *pVfs = 0; 252 #if SQLITE_THREADSAFE 253 sqlite3_mutex *mutex; 254 #endif 255 #ifndef SQLITE_OMIT_AUTOINIT 256 int rc = sqlite3_initialize(); 257 if( rc ) return 0; 258 #endif 259 #if SQLITE_THREADSAFE 260 mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); 261 #endif 262 sqlite3_mutex_enter(mutex); 263 for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){ 264 if( zVfs==0 ) break; 265 if( strcmp(zVfs, pVfs->zName)==0 ) break; 266 } 267 sqlite3_mutex_leave(mutex); 268 return pVfs; 269 } 270 271 /* 272 ** Unlink a VFS from the linked list 273 */ 274 static void vfsUnlink(sqlite3_vfs *pVfs){ 275 assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) ); 276 if( pVfs==0 ){ 277 /* No-op */ 278 }else if( vfsList==pVfs ){ 279 vfsList = pVfs->pNext; 280 }else if( vfsList ){ 281 sqlite3_vfs *p = vfsList; 282 while( p->pNext && p->pNext!=pVfs ){ 283 p = p->pNext; 284 } 285 if( p->pNext==pVfs ){ 286 p->pNext = pVfs->pNext; 287 } 288 } 289 } 290 291 /* 292 ** Register a VFS with the system. It is harmless to register the same 293 ** VFS multiple times. The new VFS becomes the default if makeDflt is 294 ** true. 295 */ 296 int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ 297 sqlite3_mutex *mutex = 0; 298 #ifndef SQLITE_OMIT_AUTOINIT 299 int rc = sqlite3_initialize(); 300 if( rc ) return rc; 301 #endif 302 mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); 303 sqlite3_mutex_enter(mutex); 304 vfsUnlink(pVfs); 305 if( makeDflt || vfsList==0 ){ 306 pVfs->pNext = vfsList; 307 vfsList = pVfs; 308 }else{ 309 pVfs->pNext = vfsList->pNext; 310 vfsList->pNext = pVfs; 311 } 312 assert(vfsList); 313 sqlite3_mutex_leave(mutex); 314 return SQLITE_OK; 315 } 316 317 /* 318 ** Unregister a VFS so that it is no longer accessible. 319 */ 320 int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ 321 #if SQLITE_THREADSAFE 322 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); 323 #endif 324 sqlite3_mutex_enter(mutex); 325 vfsUnlink(pVfs); 326 sqlite3_mutex_leave(mutex); 327 return SQLITE_OK; 328 } 329