xref: /sqlite-3.40.0/src/os.c (revision 9bccde3d)
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 || !sqlite3JournalIsInMemory(x))) { \
70     void *pTstAlloc = sqlite3Malloc(10);                             \
71     if (!pTstAlloc) return SQLITE_IOERR_NOMEM_BKPT;                  \
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;
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   }else{
301     rc = SQLITE_NOMEM_BKPT;
302   }
303   return rc;
304 }
305 int sqlite3OsCloseFree(sqlite3_file *pFile){
306   int rc = SQLITE_OK;
307   assert( pFile );
308   rc = sqlite3OsClose(pFile);
309   sqlite3_free(pFile);
310   return rc;
311 }
312 
313 /*
314 ** This function is a wrapper around the OS specific implementation of
315 ** sqlite3_os_init(). The purpose of the wrapper is to provide the
316 ** ability to simulate a malloc failure, so that the handling of an
317 ** error in sqlite3_os_init() by the upper layers can be tested.
318 */
319 int sqlite3OsInit(void){
320   void *p = sqlite3_malloc(10);
321   if( p==0 ) return SQLITE_NOMEM_BKPT;
322   sqlite3_free(p);
323   return sqlite3_os_init();
324 }
325 
326 /*
327 ** The list of all registered VFS implementations.
328 */
329 static sqlite3_vfs * SQLITE_WSD vfsList = 0;
330 #define vfsList GLOBAL(sqlite3_vfs *, vfsList)
331 
332 /*
333 ** Locate a VFS by name.  If no name is given, simply return the
334 ** first VFS on the list.
335 */
336 sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){
337   sqlite3_vfs *pVfs = 0;
338 #if SQLITE_THREADSAFE
339   sqlite3_mutex *mutex;
340 #endif
341 #ifndef SQLITE_OMIT_AUTOINIT
342   int rc = sqlite3_initialize();
343   if( rc ) return 0;
344 #endif
345 #if SQLITE_THREADSAFE
346   mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
347 #endif
348   sqlite3_mutex_enter(mutex);
349   for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){
350     if( zVfs==0 ) break;
351     if( strcmp(zVfs, pVfs->zName)==0 ) break;
352   }
353   sqlite3_mutex_leave(mutex);
354   return pVfs;
355 }
356 
357 /*
358 ** Unlink a VFS from the linked list
359 */
360 static void vfsUnlink(sqlite3_vfs *pVfs){
361   assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) );
362   if( pVfs==0 ){
363     /* No-op */
364   }else if( vfsList==pVfs ){
365     vfsList = pVfs->pNext;
366   }else if( vfsList ){
367     sqlite3_vfs *p = vfsList;
368     while( p->pNext && p->pNext!=pVfs ){
369       p = p->pNext;
370     }
371     if( p->pNext==pVfs ){
372       p->pNext = pVfs->pNext;
373     }
374   }
375 }
376 
377 /*
378 ** Register a VFS with the system.  It is harmless to register the same
379 ** VFS multiple times.  The new VFS becomes the default if makeDflt is
380 ** true.
381 */
382 int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){
383   MUTEX_LOGIC(sqlite3_mutex *mutex;)
384 #ifndef SQLITE_OMIT_AUTOINIT
385   int rc = sqlite3_initialize();
386   if( rc ) return rc;
387 #endif
388 #ifdef SQLITE_ENABLE_API_ARMOR
389   if( pVfs==0 ) return SQLITE_MISUSE_BKPT;
390 #endif
391 
392   MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
393   sqlite3_mutex_enter(mutex);
394   vfsUnlink(pVfs);
395   if( makeDflt || vfsList==0 ){
396     pVfs->pNext = vfsList;
397     vfsList = pVfs;
398   }else{
399     pVfs->pNext = vfsList->pNext;
400     vfsList->pNext = pVfs;
401   }
402   assert(vfsList);
403   sqlite3_mutex_leave(mutex);
404   return SQLITE_OK;
405 }
406 
407 /*
408 ** Unregister a VFS so that it is no longer accessible.
409 */
410 int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){
411 #if SQLITE_THREADSAFE
412   sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
413 #endif
414   sqlite3_mutex_enter(mutex);
415   vfsUnlink(pVfs);
416   sqlite3_mutex_leave(mutex);
417   return SQLITE_OK;
418 }
419