#include <sys/stat.h>
//#include <sys/ioctl.h>
#include <errno.h>
-#include <fcntl.h>\r
+#include <fcntl.h>
#include <assert.h>
//#include <linux/fd.h>
-#ifdef _WIN32\r
-#define _WIN32_WINNT 0x0400\r
-#include <windows.h>\r
-#include <winioctl.h>\r
-#define __LITTLE_ENDIAN 1234\r
-#define __BIG_ENDIAN 4321\r
-#define __BYTE_ORDER __LITTLE_ENDIAN\r
-#define inline\r
-#define __attribute__(x)\r
-#define BLOCK_SIZE 512\r
+#ifdef _WIN32
+#define _WIN32_WINNT 0x0400
+#include <windows.h>
+#include <winioctl.h>
+#define __LITTLE_ENDIAN 1234
+#define __BIG_ENDIAN 4321
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define inline
+#define __attribute__(x)
+#define BLOCK_SIZE 512
#endif
static int WIN32open(const char *path, int oflag, ...);
#define open WIN32open
-static int WIN32close(int fd);\r
+static int WIN32close(int fd);
#define close WIN32close
-static int WIN32read(int fd, void *buf, unsigned int len);\r
+static int WIN32read(int fd, void *buf, unsigned int len);
#define read WIN32read
-static int WIN32write(int fd, void *buf, unsigned int len);\r
+static int WIN32write(int fd, void *buf, unsigned int len);
#define write WIN32write
-static loff_t WIN32llseek(int fd, loff_t offset, int whence);\r
-#ifdef llseek\r
-#undef llseek\r
-#endif\r
-#define llseek WIN32llseek\r
+static loff_t WIN32llseek(int fd, loff_t offset, int whence);
+#ifdef llseek
+#undef llseek
+#endif
+#define llseek WIN32llseek
static int is_device = 0;
void fs_open(char *path,int rw)
{
-#ifdef _WIN32\r
- static char dev_buf[] = "\\\\.\\X:";\r
+#ifdef _WIN32
+ static char dev_buf[] = "\\\\.\\X:";
#else
struct stat stbuf;
#endif
- if (path[1] == ':' && path[2] == '\0') {\r
- dev_buf[4] = path[0];\r
- path = dev_buf;\r
-// is_device = 1;\r
- }\r
+ if (path[1] == ':' && path[2] == '\0') {
+ dev_buf[4] = path[0];
+ path = dev_buf;
+// is_device = 1;
+ }
if ((fd = open(path,rw ? O_RDWR : O_RDONLY)) < 0)
pdie("open %s",path);
void fs_read(loff_t pos,int size,void *data)
{
CHANGE *walk;
- int got;\r
-#if 1 // TMN\r
- const size_t readsize_aligned = (size % 512) ? (size + (512 - (size % 512))) : size; // TMN:\r
- const loff_t seekpos_aligned = pos - (pos % 512); // TMN:\r
- const size_t seek_delta = (size_t)(pos - seekpos_aligned); // TMN:\r
- const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned; // TMN: \r
- char* tmpBuf = malloc(readsize_aligned); // TMN:\r
-#ifdef _MSC_VER\r
- if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %I64d",pos);\r
- if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %I64dd",size,pos);\r
-#else\r
- if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos);\r
- if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %lld",size,pos);\r
-#endif\r
- assert(got >= size);\r
+ int got;
+#if 1 // TMN
+ const size_t readsize_aligned = (size % 512) ? (size + (512 - (size % 512))) : size; // TMN:
+ const loff_t seekpos_aligned = pos - (pos % 512); // TMN:
+ const size_t seek_delta = (size_t)(pos - seekpos_aligned); // TMN:
+ const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned; // TMN:
+ char* tmpBuf = malloc(readsize_aligned); // TMN:
+#ifdef _MSC_VER
+ if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %I64d",pos);
+ if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %I64dd",size,pos);
+#else
+ if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos);
+ if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %lld",size,pos);
+#endif
+ assert(got >= size);
got = size;
- assert(seek_delta + size <= readsize);\r
- memcpy(data, tmpBuf+seek_delta, size);\r
- free(tmpBuf);\r
+ assert(seek_delta + size <= readsize);
+ memcpy(data, tmpBuf+seek_delta, size);
+ free(tmpBuf);
#else // TMN:
if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos);
- if ((got = read(fd,data,size)) < 0) pdie("Read %d bytes at %lld",size,pos);\r
+ if ((got = read(fd,data,size)) < 0) pdie("Read %d bytes at %lld",size,pos);
#endif // TMN:
if (got != size) die("Got %d bytes instead of %d at %lld",got,size,pos);
for (walk = changes; walk; walk = walk->next) {
CHANGE *new;
int did;
+#if 1 //SAE
+ void *scratch;
+ const size_t readsize_aligned = (size % 512) ? (size + (512 - (size % 512))) : size;
+ const loff_t seekpos_aligned = pos - (pos % 512);
+ const size_t seek_delta = (size_t)(pos - seekpos_aligned);
+ const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned;
+ scratch = alloc(readsize_aligned);
+
+ if (write_immed) {
+ did_change = 1;
+ if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos);
+ if ((did = write(fd,data,readsize_aligned)) == (int)readsize_aligned)
+ {
+ free(scratch);
+ return;
+ }
+ if (did < 0) pdie("Write %d bytes at %lld",size,pos);
+ die("Wrote %d bytes instead of %d at %lld",did,size,pos);
+ }
+ new = alloc(sizeof(CHANGE));
+ new->pos = pos;
+ memcpy(new->data = alloc(new->size = readsize_aligned),data,readsize_aligned);
+ new->next = NULL;
+ if (last) last->next = new;
+ else changes = new;
+ last = new;
+
+#else //SAE
if (write_immed) {
did_change = 1;
if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos);
if (last) last->next = new;
else changes = new;
last = new;
+#endif //SAE
}
/* tab-width: 8 */
/* End: */
-\r
-#define O_SHORT_LIVED _O_SHORT_LIVED\r
-//#define O_ACCMODE 3\r
-#define O_NONE 3\r
-#define O_BACKUP 0x10000\r
-#define O_SHARED 0x20000\r
-\r
-static int WIN32open(const char *path, int oflag, ...)\r
-{\r
- HANDLE fh;\r
- DWORD desiredAccess;\r
- DWORD shareMode;\r
- DWORD creationDisposition;\r
- DWORD flagsAttributes = FILE_ATTRIBUTE_NORMAL;\r
- SECURITY_ATTRIBUTES securityAttributes;\r
- va_list ap;\r
- int pmode;\r
- int trunc = FALSE;\r
-\r
- securityAttributes.nLength = sizeof(securityAttributes);\r
- securityAttributes.lpSecurityDescriptor = NULL;\r
- securityAttributes.bInheritHandle = oflag & O_NOINHERIT ? FALSE : TRUE;\r
- switch (oflag & O_ACCMODE) {\r
- case O_RDONLY:\r
- desiredAccess = GENERIC_READ;\r
-// shareMode = FILE_SHARE_READ;\r
- shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE; // TMN:\r
- break;\r
- case O_WRONLY:\r
- exit(42);\r
- desiredAccess = GENERIC_WRITE;\r
- shareMode = 0;\r
- break;\r
- case O_RDWR:\r
- exit(43);\r
- desiredAccess = GENERIC_READ|GENERIC_WRITE;\r
- shareMode = 0;\r
- break;\r
- case O_NONE:\r
- exit(44);\r
- desiredAccess = 0;\r
- shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;\r
- }\r
- if (oflag & O_APPEND) {\r
- exit(45);\r
- desiredAccess |= FILE_APPEND_DATA|SYNCHRONIZE;\r
- shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;\r
- }\r
- if (oflag & O_SHARED)\r
- shareMode |= FILE_SHARE_READ|FILE_SHARE_WRITE;\r
- switch (oflag & (O_CREAT|O_EXCL|O_TRUNC)) {\r
- case 0:\r
- case O_EXCL:\r
- creationDisposition = OPEN_EXISTING;\r
- break;\r
- case O_CREAT:\r
- exit(46);\r
- creationDisposition = OPEN_ALWAYS;\r
- break;\r
- case O_CREAT|O_EXCL:\r
- case O_CREAT|O_TRUNC|O_EXCL:\r
- exit(47);\r
- creationDisposition = CREATE_NEW;\r
- break;\r
- case O_TRUNC:\r
- case O_TRUNC|O_EXCL:\r
- exit(48);\r
- creationDisposition = TRUNCATE_EXISTING;\r
- break;\r
- case O_CREAT|O_TRUNC:\r
- exit(49);\r
- creationDisposition = OPEN_ALWAYS;\r
- trunc = TRUE;\r
- break;\r
- }\r
- if (oflag & O_CREAT) {\r
- exit(50);\r
- va_start(ap, oflag);\r
- pmode = va_arg(ap, int);\r
- va_end(ap);\r
- if ((pmode & 0222) == 0)\r
- flagsAttributes |= FILE_ATTRIBUTE_READONLY;\r
- }\r
- if (oflag & O_TEMPORARY) {\r
- exit(51);\r
- flagsAttributes |= FILE_FLAG_DELETE_ON_CLOSE;\r
- desiredAccess |= DELETE;\r
- }\r
- if (oflag & O_SHORT_LIVED)\r
- flagsAttributes |= FILE_ATTRIBUTE_TEMPORARY;\r
- if (oflag & O_SEQUENTIAL)\r
- flagsAttributes |= FILE_FLAG_SEQUENTIAL_SCAN;\r
- else if (oflag & O_RANDOM)\r
- flagsAttributes |= FILE_FLAG_RANDOM_ACCESS;\r
- if (oflag & O_BACKUP)\r
- flagsAttributes |= FILE_FLAG_BACKUP_SEMANTICS;\r
- if ((fh = CreateFile(path, desiredAccess, shareMode, &securityAttributes,\r
- creationDisposition, flagsAttributes, NULL)) == INVALID_HANDLE_VALUE) {\r
- errno = GetLastError();\r
- return -1;\r
- }\r
- if (trunc) {\r
- exit(52);\r
- if (!SetEndOfFile(fh)) {\r
- errno = GetLastError();\r
- CloseHandle(fh);\r
- DeleteFile(path);\r
- return -1;\r
- }\r
- }\r
- return (int)fh;\r
-}\r
-\r
-static int WIN32close(int fd)\r
-{\r
- if (!CloseHandle((HANDLE)fd)) {\r
- errno = GetLastError();\r
- return -1;\r
- }\r
- return 0;\r
-}\r
-\r
-static int WIN32read(int fd, void *buf, unsigned int len)\r
-{\r
- DWORD actualLen;\r
-\r
- if (!ReadFile((HANDLE)fd, buf, (DWORD)len, &actualLen, NULL)) {\r
- errno = GetLastError();\r
- if (errno == ERROR_BROKEN_PIPE)\r
- return 0;\r
- else\r
- return -1;\r
- }\r
- return (int)actualLen;\r
-}\r
-\r
-static int WIN32write(int fd, void *buf, unsigned int len)\r
-{\r
- DWORD actualLen;\r
-\r
- if (!WriteFile((HANDLE)fd, buf, (DWORD)len, &actualLen, NULL)) {\r
- errno = GetLastError();\r
- return -1;\r
- }\r
- return (int)actualLen;\r
-}\r
-\r
-static loff_t WIN32llseek(int fd, loff_t offset, int whence)\r
-{\r
- long lo, hi;\r
- DWORD err;\r
-\r
- lo = (long)(offset & 0xffffffff);\r
- hi = (long)(offset >> 32);\r
- lo = SetFilePointer((HANDLE)fd, lo, &hi, whence);\r
- if (lo == 0xFFFFFFFF && (err = GetLastError()) != NO_ERROR) {\r
- errno = err;\r
- return -1;\r
- }\r
- return ((loff_t)hi << 32) | (__u32)lo;\r
-}\r
-\r
-int fsctl(int fd, int code)\r
-{\r
- DWORD ret;\r
- if (!DeviceIoControl((HANDLE)fd, code, NULL, 0, NULL, 0, &ret, NULL)) {\r
- errno = GetLastError();\r
- return -1;\r
- }\r
- return 0; \r
-}\r
+
+#define O_SHORT_LIVED _O_SHORT_LIVED
+//#define O_ACCMODE 3
+#define O_NONE 3
+#define O_BACKUP 0x10000
+#define O_SHARED 0x20000
+
+static int WIN32open(const char *path, int oflag, ...)
+{
+ HANDLE fh;
+ DWORD desiredAccess;
+ DWORD shareMode;
+ DWORD creationDisposition;
+ DWORD flagsAttributes = FILE_ATTRIBUTE_NORMAL;
+ SECURITY_ATTRIBUTES securityAttributes;
+ va_list ap;
+ int pmode;
+ int trunc = FALSE;
+
+ securityAttributes.nLength = sizeof(securityAttributes);
+ securityAttributes.lpSecurityDescriptor = NULL;
+ securityAttributes.bInheritHandle = oflag & O_NOINHERIT ? FALSE : TRUE;
+ switch (oflag & O_ACCMODE) {
+ case O_RDONLY:
+ desiredAccess = GENERIC_READ;
+// shareMode = FILE_SHARE_READ;
+ shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE; // TMN:
+ break;
+ case O_WRONLY:
+ desiredAccess = GENERIC_WRITE;
+ shareMode = 0;
+ break;
+ case O_RDWR:
+ desiredAccess = GENERIC_READ|GENERIC_WRITE;
+ shareMode = 0;
+ break;
+ case O_NONE:
+ desiredAccess = 0;
+ shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
+ }
+ if (oflag & O_APPEND) {
+ desiredAccess |= FILE_APPEND_DATA|SYNCHRONIZE;
+ shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
+ }
+ if (oflag & O_SHARED)
+ shareMode |= FILE_SHARE_READ|FILE_SHARE_WRITE;
+ switch (oflag & (O_CREAT|O_EXCL|O_TRUNC)) {
+ case 0:
+ case O_EXCL:
+ creationDisposition = OPEN_EXISTING;
+ break;
+ case O_CREAT:
+ creationDisposition = OPEN_ALWAYS;
+ break;
+ case O_CREAT|O_EXCL:
+ case O_CREAT|O_TRUNC|O_EXCL:
+ creationDisposition = CREATE_NEW;
+ break;
+ case O_TRUNC:
+ case O_TRUNC|O_EXCL:
+ creationDisposition = TRUNCATE_EXISTING;
+ break;
+ case O_CREAT|O_TRUNC:
+ creationDisposition = OPEN_ALWAYS;
+ trunc = TRUE;
+ break;
+ }
+ if (oflag & O_CREAT) {
+ va_start(ap, oflag);
+ pmode = va_arg(ap, int);
+ va_end(ap);
+ if ((pmode & 0222) == 0)
+ flagsAttributes |= FILE_ATTRIBUTE_READONLY;
+ }
+ if (oflag & O_TEMPORARY) {
+ flagsAttributes |= FILE_FLAG_DELETE_ON_CLOSE;
+ desiredAccess |= DELETE;
+ }
+ if (oflag & O_SHORT_LIVED)
+ flagsAttributes |= FILE_ATTRIBUTE_TEMPORARY;
+ if (oflag & O_SEQUENTIAL)
+ flagsAttributes |= FILE_FLAG_SEQUENTIAL_SCAN;
+ else if (oflag & O_RANDOM)
+ flagsAttributes |= FILE_FLAG_RANDOM_ACCESS;
+ if (oflag & O_BACKUP)
+ flagsAttributes |= FILE_FLAG_BACKUP_SEMANTICS;
+ if ((fh = CreateFile(path, desiredAccess, shareMode, &securityAttributes,
+ creationDisposition, flagsAttributes, NULL)) == INVALID_HANDLE_VALUE) {
+ errno = GetLastError();
+ return -1;
+ }
+ if (trunc) {
+ if (!SetEndOfFile(fh)) {
+ errno = GetLastError();
+ CloseHandle(fh);
+ DeleteFile(path);
+ return -1;
+ }
+ }
+ return (int)fh;
+}
+
+static int WIN32close(int fd)
+{
+ if (!CloseHandle((HANDLE)fd)) {
+ errno = GetLastError();
+ return -1;
+ }
+ return 0;
+}
+
+static int WIN32read(int fd, void *buf, unsigned int len)
+{
+ DWORD actualLen;
+
+ if (!ReadFile((HANDLE)fd, buf, (DWORD)len, &actualLen, NULL)) {
+ errno = GetLastError();
+ if (errno == ERROR_BROKEN_PIPE)
+ return 0;
+ else
+ return -1;
+ }
+ return (int)actualLen;
+}
+
+static int WIN32write(int fd, void *buf, unsigned int len)
+{
+ DWORD actualLen;
+
+ if (!WriteFile((HANDLE)fd, buf, (DWORD)len, &actualLen, NULL)) {
+ errno = GetLastError();
+ return -1;
+ }
+ return (int)actualLen;
+}
+
+static loff_t WIN32llseek(int fd, loff_t offset, int whence)
+{
+ long lo, hi;
+ DWORD err;
+
+ lo = (long)(offset & 0xffffffff);
+ hi = (long)(offset >> 32);
+ lo = SetFilePointer((HANDLE)fd, lo, &hi, whence);
+ if (lo == 0xFFFFFFFF && (err = GetLastError()) != NO_ERROR) {
+ errno = err;
+ return -1;
+ }
+ return ((loff_t)hi << 32) | (__u32)lo;
+}
+
+int fsctl(int fd, int code)
+{
+ DWORD ret;
+ if (!DeviceIoControl((HANDLE)fd, code, NULL, 0, NULL, 0, &ret, NULL)) {
+ errno = GetLastError();
+ return -1;
+ }
+ return 0;
+}