/*-
 * Public Domain 2014-2018 MongoDB, Inc.
 * Public Domain 2008-2014 WiredTiger, Inc.
 *
 * This is free and unencumbered software released into the public domain.
 *
 * Anyone is free to copy, modify, publish, use, compile, sell, or
 * distribute this software, either in source code form or as a compiled
 * binary, for any purpose, commercial or non-commercial, and by any
 * means.
 *
 * In jurisdictions that recognize copyright laws, the author or authors
 * of this software dedicate any and all copyright interest in the
 * software to the public domain. We make this dedication for the benefit
 * of the public at large and to the detriment of our heirs and
 * successors. We intend this dedication to be an overt act of
 * relinquishment in perpetuity of all present and future rights to this
 * software under copyright law.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */

/*
 * base.run
 * Command line syscall test runner
 */
#ifdef __linux__
SYSTEM("Linux");
#define OPEN_EXISTING(name, flags)		open(name, flags)
#else /* __linux__ */
SYSTEM("Darwin");
#define O_NOATIME 0
#define OPEN_EXISTING(name, flags)		open(name, flags, 0)
#endif /* __linux__ */

#ifdef HAVE_FTRUNCATE
#ifdef __linux__
#define FTRUNCATE(fd, len)			ftruncate(fd, len)
#else
#define FTRUNCATE(fd, len)			ftruncate(fd, len, len)
#endif
#else
#define FTRUNCATE(fd, len)			/* do nothing */
#endif

TRACE("close,fdatasync,fsync,ftruncate,open,pwrite64,rename");
RUN("");
...
OUTPUT("--------------wiredtiger_open");
// lock == 3
lock = open("./WiredTiger.lock", O_RDWR|O_CREAT|O_CLOEXEC, 0666);
pwrite64(lock, "WiredTiger lock file\n", 0x15, 0x0);
fd = open("./WiredTiger", O_RDWR|O_CREAT|O_CLOEXEC, 0666);
pwrite64(fd, "WiredTiger\nWiredTiger"..., ...);
#ifdef __linux__
fdatasync(fd);
#endif /* __linux__ */
close(fd);

...  // On Linux, there are calls to open and read "/proc/meminfo" here.

fd = open("./WiredTiger.basecfg.set", O_RDWR|O_CREAT|O_EXCL|O_CLOEXEC, 0666);
pwrite64(fd, "# Do not modify this file."..., ...);
#ifdef __linux__
fdatasync(fd);
#endif /* __linux__ */
close(fd);
rename("./WiredTiger.basecfg.set", "./WiredTiger.basecfg");

#ifdef __linux__
dir = open("./", O_RDONLY); 
fdatasync(dir);
close(dir);
#endif

fd = open("./WiredTiger.wt", O_RDWR|O_CREAT|O_EXCL|O_NOATIME|O_CLOEXEC, 0666);

#ifdef __linux__
dir = open("./", O_RDONLY); 
fdatasync(dir);
close(dir);
#endif /* __linux__ */

pwrite64(fd, ""..., 0x1000, 0x0);
#ifdef __linux__
fdatasync(fd);
#endif /* __linux__ */
close(fd);

wt = OPEN_EXISTING("./WiredTiger.wt\0", O_RDWR|O_NOATIME|O_CLOEXEC);
FTRUNCATE(wt, 0x1000);

fd = open("./WiredTiger.turtle.set\0", O_RDWR|O_CREAT|O_EXCL|O_CLOEXEC, 0666);
pwrite64(fd, "WiredTiger version string\nWiredTiger"..., ...);
#ifdef __linux__
fdatasync(fd);
#endif /* __linux__ */
close(fd);
rename("./WiredTiger.turtle.set", "./WiredTiger.turtle");

...  // There is a second open of turtle here, is it important?

fd = open("./WiredTigerLAS.wt", O_RDWR|O_CREAT|O_EXCL|O_NOATIME|O_CLOEXEC, 0666);

#ifdef __linux__
dir = open("./", O_RDONLY); 
fdatasync(dir);
close(dir);
#endif /* __linux__ */

pwrite64(fd, ""..., 0x1000, 0x0);

#ifdef __linux__
fdatasync(fd);
#endif /* __linux__ */

close(fd);
fd = OPEN_EXISTING("./WiredTigerLAS.wt", O_RDWR|O_NOATIME|O_CLOEXEC);
FTRUNCATE(fd, 0x1000);
fd = OPEN_EXISTING("./WiredTiger.turtle", O_RDWR|O_CLOEXEC);
close(fd);
pwrite64(wt, ""..., 0x1000, 0x1000);
pwrite64(wt, ""..., 0x1000, 0x2000);
pwrite64(wt, ""..., 0x1000, 0x3000);
#ifdef __linux__
fdatasync(wt);
#endif /* __linux__ */
fd = OPEN_EXISTING("./WiredTiger.turtle", O_RDWR|O_CLOEXEC);

close(fd);
fd = open("./WiredTiger.turtle.set", O_RDWR|O_CREAT|O_EXCL|O_CLOEXEC, 0666);
pwrite64(fd, "WiredTiger version string\nWiredTiger"..., ...);
#ifdef __linux__
fdatasync(fd);
#endif /* __linux__ */
close(fd);
rename("./WiredTiger.turtle.set", "./WiredTiger.turtle");
#ifdef __linux__
dir = open("./", O_RDONLY); 
fdatasync(dir);
close(dir);
fdatasync(wt);
#endif /* __linux__ */

OUTPUT("--------------open_session");
OUTPUT("--------------create");

hello = open("./hello.wt", O_RDWR|O_CREAT|O_EXCL|O_NOATIME|O_CLOEXEC, 0666);
#ifdef __linux__
dir = open("./", O_RDONLY); 
fdatasync(dir);
close(dir);
#endif /* __linux__ */
pwrite64(hello, "A\330\001"..., 0x1000, 0x0);
#ifdef __linux__
fdatasync(hello);
#endif /* __linux__ */
close(hello);
hello = OPEN_EXISTING("./hello.wt", O_RDWR|O_NOATIME|O_CLOEXEC);
FTRUNCATE(hello, 0x1000);
turtle = OPEN_EXISTING("./WiredTiger.turtle", O_RDWR|O_CLOEXEC);
close(turtle);
...  // more changes to turtle
OUTPUT("--------------rename");
#ifdef __linux__
FTRUNCATE(hello, 0x1000);
#endif /* __linux__ */
close(hello);
rename("./hello.wt", "./world.wt");
// Changes to turtle, more writes to wt.
turtle = OPEN_EXISTING("./WiredTiger.turtle", O_RDWR|O_CLOEXEC);
close(turtle);
...
OUTPUT("--------------drop");
...
OUTPUT("--------------WT_CONNECTION::close");
...
