15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2011 March 28 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. In place of 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you do good and not evil. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you find forgiveness for yourself and forgive others. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you share freely, never taking more than you give. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)************************************************************************* 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The code in this file implements a Tcl interface used to test error 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** handling in the os_unix.c module. Wrapper functions that support fault 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** injection are registered as the low-level OS functions using the 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** xSetSystemCall() method of the VFS. The Tcl interface is as follows: 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test_syscall install LIST 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Install wrapper functions for all system calls in argument LIST. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** LIST must be a list consisting of zero or more of the following 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** literal values: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** open close access getcwd stat fstat 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ftruncate fcntl read pread pread64 write 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pwrite pwrite64 fchmod fallocate 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test_syscall uninstall 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Uninstall all wrapper functions. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test_syscall fault ?COUNT PERSIST? 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If [test_syscall fault] is invoked without the two arguments, fault 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** injection is disabled. Otherwise, fault injection is configured to 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cause a failure on the COUNT'th next call to a system call with a 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** wrapper function installed. A COUNT value of 1 means fail the next 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** system call. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Argument PERSIST is interpreted as a boolean. If true, the all 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** system calls following the initial failure also fail. Otherwise, only 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the single transient failure is injected. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test_syscall errno CALL ERRNO 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the value that the global "errno" is set to following a fault 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in call CALL. Argument CALL must be one of the system call names 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** listed above (under [test_syscall install]). ERRNO is a symbolic 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** name (i.e. "EACCES"). Not all errno codes are supported. Add extra 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the aErrno table in function test_syscall_errno() below as 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** required. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test_syscall reset ?SYSTEM-CALL? 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** With no argument, this is an alias for the [uninstall] command. However, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this command uses a VFS call of the form: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** xSetSystemCall(pVfs, 0, 0); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** To restore the default system calls. The [uninstall] command restores 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** each system call individually by calling (i.e.): 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** xSetSystemCall(pVfs, "open", 0); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** With an argument, this command attempts to reset the system call named 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by the parameter using the same method as [uninstall]. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test_syscall exists SYSTEM-CALL 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if the named system call exists. Or false otherwise. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test_syscall list 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a list of all system calls. The list is constructed using 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the xNextSystemCall() VFS method. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqlite3.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tcl.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h> 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_OS_UNIX 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* From test1.c */ 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char *sqlite3TestErrorName(int); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h> 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct TestSyscallGlobal { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bPersist; /* 1 for persistent errors, 0 for transient */ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCount; /* Fail after this many more calls */ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nFail; /* Number of failures that have occurred */ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} gSyscall = { 0, 0 }; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_open(const char *, int, int); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_close(int fd); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_access(const char *zPath, int mode); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *ts_getcwd(char *zPath, size_t nPath); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_stat(const char *zPath, struct stat *p); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_fstat(int fd, struct stat *p); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_ftruncate(int fd, off_t n); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_fcntl(int fd, int cmd, ... ); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_read(int fd, void *aBuf, size_t nBuf); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_pread(int fd, void *aBuf, size_t nBuf, off_t off); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_pread64(int fd, void *aBuf, size_t nBuf, off_t off); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_write(int fd, const void *aBuf, size_t nBuf); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_pwrite(int fd, const void *aBuf, size_t nBuf, off_t off); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_pwrite64(int fd, const void *aBuf, size_t nBuf, off_t off); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_fchmod(int fd, mode_t mode); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_fallocate(int fd, off_t off, off_t len); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestSyscallArray { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zName; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_syscall_ptr xTest; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_syscall_ptr xOrig; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_errno; /* Default value for errno following errors */ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int custom_errno; /* Current value for errno if error */ 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} aSyscall[] = { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 0 */ { "open", (sqlite3_syscall_ptr)ts_open, 0, EACCES, 0 }, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1 */ { "close", (sqlite3_syscall_ptr)ts_close, 0, 0, 0 }, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2 */ { "access", (sqlite3_syscall_ptr)ts_access, 0, 0, 0 }, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3 */ { "getcwd", (sqlite3_syscall_ptr)ts_getcwd, 0, 0, 0 }, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4 */ { "stat", (sqlite3_syscall_ptr)ts_stat, 0, 0, 0 }, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5 */ { "fstat", (sqlite3_syscall_ptr)ts_fstat, 0, 0, 0 }, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6 */ { "ftruncate", (sqlite3_syscall_ptr)ts_ftruncate, 0, EIO, 0 }, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7 */ { "fcntl", (sqlite3_syscall_ptr)ts_fcntl, 0, EACCES, 0 }, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8 */ { "read", (sqlite3_syscall_ptr)ts_read, 0, 0, 0 }, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 9 */ { "pread", (sqlite3_syscall_ptr)ts_pread, 0, 0, 0 }, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10 */ { "pread64", (sqlite3_syscall_ptr)ts_pread64, 0, 0, 0 }, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 11 */ { "write", (sqlite3_syscall_ptr)ts_write, 0, 0, 0 }, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 12 */ { "pwrite", (sqlite3_syscall_ptr)ts_pwrite, 0, 0, 0 }, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13 */ { "pwrite64", (sqlite3_syscall_ptr)ts_pwrite64, 0, 0, 0 }, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14 */ { "fchmod", (sqlite3_syscall_ptr)ts_fchmod, 0, 0, 0 }, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15 */ { "fallocate", (sqlite3_syscall_ptr)ts_fallocate, 0, 0, 0 }, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, 0 } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_open ((int(*)(const char *, int, int))aSyscall[0].xOrig) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_close ((int(*)(int))aSyscall[1].xOrig) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_access ((int(*)(const char*,int))aSyscall[2].xOrig) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_getcwd ((char*(*)(char*,size_t))aSyscall[3].xOrig) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_stat ((int(*)(const char*,struct stat*))aSyscall[4].xOrig) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_fstat ((int(*)(int,struct stat*))aSyscall[5].xOrig) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_ftruncate ((int(*)(int,off_t))aSyscall[6].xOrig) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_fcntl ((int(*)(int,int,...))aSyscall[7].xOrig) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_read ((ssize_t(*)(int,void*,size_t))aSyscall[8].xOrig) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_pread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].xOrig) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_pread64 ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[10].xOrig) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_write ((ssize_t(*)(int,const void*,size_t))aSyscall[11].xOrig) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_pwrite ((ssize_t(*)(int,const void*,size_t,off_t))\ 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aSyscall[12].xOrig) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_pwrite64 ((ssize_t(*)(int,const void*,size_t,off_t))\ 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aSyscall[13].xOrig) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_fchmod ((int(*)(int,mode_t))aSyscall[14].xOrig) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define orig_fallocate ((int(*)(int,off_t,off_t))aSyscall[15].xOrig) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is called exactly once from within each invocation of a 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** system call wrapper in this file. It returns 1 if the function should 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** fail, or 0 if it should succeed. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int tsIsFail(void){ 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gSyscall.nCount--; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( gSyscall.nCount==0 || (gSyscall.nFail && gSyscall.bPersist) ){ 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gSyscall.nFail++; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the current error-number value for function zFunc. zFunc must be 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the name of a system call in the aSyscall[] table. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usually, the current error-number is the value that errno should be set 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to if the named system call fails. The exception is "fallocate". See 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** comments above the implementation of ts_fallocate() for details. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int tsErrno(const char *zFunc){ 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nFunc = strlen(zFunc); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; aSyscall[i].zName; i++){ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strlen(aSyscall[i].zName)!=nFunc ) continue; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( memcmp(aSyscall[i].zName, zFunc, nFunc) ) continue; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return aSyscall[i].custom_errno; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(0); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around tsIsFail(). If tsIsFail() returns non-zero, set the 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value of errno before returning. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int tsIsFailErrno(const char *zFunc){ 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFail() ){ 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errno = tsErrno(zFunc); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around open(). 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_open(const char *zFile, int flags, int mode){ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("open") ){ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_open(zFile, flags, mode); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around close(). 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_close(int fd){ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFail() ){ 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Even if simulating an error, close the original file-descriptor. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This is to stop the test process from running out of file-descriptors 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** when running a long test. If a call to close() appears to fail, SQLite 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** never attempts to use the file-descriptor afterwards (or even to close 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** it a second time). */ 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) orig_close(fd); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_close(fd); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around access(). 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_access(const char *zPath, int mode){ 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFail() ){ 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_access(zPath, mode); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around getcwd(). 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *ts_getcwd(char *zPath, size_t nPath){ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFail() ){ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_getcwd(zPath, nPath); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around stat(). 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_stat(const char *zPath, struct stat *p){ 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFail() ){ 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_stat(zPath, p); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around fstat(). 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_fstat(int fd, struct stat *p){ 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("fstat") ){ 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_fstat(fd, p); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around ftruncate(). 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_ftruncate(int fd, off_t n){ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("ftruncate") ){ 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_ftruncate(fd, n); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around fcntl(). 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_fcntl(int fd, int cmd, ... ){ 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *pArg; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("fcntl") ){ 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, cmd); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pArg = va_arg(ap, void *); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_fcntl(fd, cmd, pArg); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around read(). 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_read(int fd, void *aBuf, size_t nBuf){ 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("read") ){ 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_read(fd, aBuf, nBuf); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around pread(). 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_pread(int fd, void *aBuf, size_t nBuf, off_t off){ 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("pread") ){ 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_pread(fd, aBuf, nBuf, off); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around pread64(). 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_pread64(int fd, void *aBuf, size_t nBuf, off_t off){ 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("pread64") ){ 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_pread64(fd, aBuf, nBuf, off); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around write(). 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_write(int fd, const void *aBuf, size_t nBuf){ 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("write") ){ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_write(fd, aBuf, nBuf); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around pwrite(). 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_pwrite(int fd, const void *aBuf, size_t nBuf, off_t off){ 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("pwrite") ){ 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_pwrite(fd, aBuf, nBuf, off); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around pwrite64(). 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_pwrite64(int fd, const void *aBuf, size_t nBuf, off_t off){ 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFailErrno("pwrite64") ){ 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_pwrite64(fd, aBuf, nBuf, off); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around fchmod(). 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_fchmod(int fd, mode_t mode){ 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFail() ){ 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_fchmod(fd, mode); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A wrapper around fallocate(). 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLite assumes that the fallocate() function is compatible with 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** posix_fallocate(). According to the Linux man page (2009-09-30): 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** posix_fallocate() returns zero on success, or an error number on 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** failure. Note that errno is not set. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ts_fallocate(int fd, off_t off, off_t len){ 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tsIsFail() ){ 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tsErrno("fallocate"); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return orig_fallocate(fd, off, len); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_syscall_install( 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nElem; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj **apElem; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 2, objv, "SYSCALL-LIST"); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_ListObjGetElements(interp, objv[2], &nElem, &apElem) ){ 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVfs = sqlite3_vfs_find(0); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nElem; i++){ 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCall; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = Tcl_GetIndexFromObjStruct(interp, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apElem[i], aSyscall, sizeof(aSyscall[0]), "system-call", 0, &iCall 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ) return rc; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aSyscall[iCall].xOrig==0 ){ 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aSyscall[iCall].xOrig = pVfs->xGetSystemCall(pVfs, aSyscall[iCall].zName); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVfs->xSetSystemCall(pVfs, aSyscall[iCall].zName, aSyscall[iCall].xTest); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aSyscall[iCall].custom_errno = aSyscall[iCall].default_errno; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_syscall_uninstall( 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 2, objv, ""); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVfs = sqlite3_vfs_find(0); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; aSyscall[i].zName; i++){ 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aSyscall[i].xOrig ){ 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVfs->xSetSystemCall(pVfs, aSyscall[i].zName, 0); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aSyscall[i].xOrig = 0; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_syscall_reset( 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 && objc!=3 ){ 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 2, objv, ""); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVfs = sqlite3_vfs_find(0); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==2 ){ 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = pVfs->xSetSystemCall(pVfs, 0, 0); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; aSyscall[i].zName; i++) aSyscall[i].xOrig = 0; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nFunc; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zFunc = Tcl_GetStringFromObj(objv[2], &nFunc); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = pVfs->xSetSystemCall(pVfs, Tcl_GetString(objv[2]), 0); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; rc==SQLITE_OK && aSyscall[i].zName; i++){ 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strlen(aSyscall[i].zName)!=nFunc ) continue; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( memcmp(aSyscall[i].zName, zFunc, nFunc) ) continue; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aSyscall[i].xOrig = 0; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3TestErrorName(rc), -1)); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ResetResult(interp); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_syscall_exists( 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_syscall_ptr x; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 2, objv, ""); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVfs = sqlite3_vfs_find(0); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = pVfs->xGetSystemCall(pVfs, Tcl_GetString(objv[2])); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewBooleanObj(x!=0)); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_syscall_fault( 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCount = 0; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bPersist = 0; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 && objc!=4 ){ 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 2, objv, "?COUNT PERSIST?"); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==4 ){ 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &nCount) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || Tcl_GetBooleanFromObj(interp, objv[3], &bPersist) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(gSyscall.nFail)); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gSyscall.nCount = nCount; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gSyscall.bPersist = bPersist; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gSyscall.nFail = 0; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_syscall_errno( 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCall; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iErrno; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Errno { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *z; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aErrno[] = { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "EACCES", EACCES }, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "EINTR", EINTR }, 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "EIO", EIO }, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "EOVERFLOW", EOVERFLOW }, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ENOMEM", ENOMEM }, 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "EAGAIN", EAGAIN }, 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ETIMEDOUT", ETIMEDOUT }, 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "EBUSY", EBUSY }, 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "EPERM", EPERM }, 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "EDEADLK", EDEADLK }, 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ENOLCK", ENOLCK }, 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0 } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 2, objv, "SYSCALL ERRNO"); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = Tcl_GetIndexFromObjStruct(interp, 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objv[2], aSyscall, sizeof(aSyscall[0]), "system-call", 0, &iCall 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=TCL_OK ) return rc; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = Tcl_GetIndexFromObjStruct(interp, 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objv[3], aErrno, sizeof(aErrno[0]), "errno", 0, &iErrno 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=TCL_OK ) return rc; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aSyscall[iCall].custom_errno = aErrno[iErrno].i; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_syscall_list( 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zSys; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pList; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 2, objv, ""); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVfs = sqlite3_vfs_find(0); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pList = Tcl_NewObj(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(pList); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(zSys = pVfs->xNextSystemCall(pVfs, 0); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSys!=0; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSys = pVfs->xNextSystemCall(pVfs, zSys) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pList, Tcl_NewStringObj(zSys, -1)); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, pList); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pList); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_syscall_defaultvfs( 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 2, objv, ""); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVfs = sqlite3_vfs_find(0); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewStringObj(pVfs->zName, -1)); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_syscall( 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SyscallCmd { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zName; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ObjCmdProc *xCmd; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aCmd[] = { 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "fault", test_syscall_fault }, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "install", test_syscall_install }, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "uninstall", test_syscall_uninstall }, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "reset", test_syscall_reset }, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "errno", test_syscall_errno }, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "exists", test_syscall_exists }, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "list", test_syscall_list }, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "defaultvfs", test_syscall_defaultvfs }, 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0 } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCmd; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc<2 ){ 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "SUB-COMMAND ..."); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = Tcl_GetIndexFromObjStruct(interp, 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objv[1], aCmd, sizeof(aCmd[0]), "sub-command", 0, &iCmd 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=TCL_OK ) return rc; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return aCmd[iCmd].xCmd(clientData, interp, objc, objv); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SqlitetestSyscall_Init(Tcl_Interp *interp){ 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SyscallCmd { 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zName; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ObjCmdProc *xCmd; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aCmd[] = { 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "test_syscall", test_syscall}, 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CreateObjCommand(interp, aCmd[i].zName, aCmd[i].xCmd, 0, 0); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SqlitetestSyscall_Init(Tcl_Interp *interp){ 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675