another shot at fixing writes
[reactos.git] / rosapps / sysutils / dosfsck / io.c
index 894a714..76d9784 100644 (file)
 #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
 
 
@@ -56,33 +56,33 @@ unsigned device_no;
 
 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);
@@ -100,28 +100,28 @@ void fs_open(char *path,int rw)
 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) {
@@ -165,6 +165,34 @@ void fs_write(loff_t pos,int size,void *data)
     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);
@@ -179,6 +207,7 @@ void fs_write(loff_t pos,int size,void *data)
     if (last) last->next = new;
     else changes = new;
     last = new;
+#endif //SAE
 }
 
 
@@ -232,174 +261,163 @@ int fs_changed(void)
 /* 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; 
+}