- Fixed _chmod and _wchmod.
authorHartmut Birr <osexpert@googlemail.com>
Wed, 28 Apr 2004 20:20:00 +0000 (20:20 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Wed, 28 Apr 2004 20:20:00 +0000 (20:20 +0000)
svn path=/trunk/; revision=9236

reactos/lib/msvcrt/io/chmod.c
reactos/lib/msvcrt/io/wchmod.c

index 08614ec..7bff67f 100644 (file)
 int _chmod(const char* filename, mode_t mode)
 {
     DWORD FileAttributes = 0;
+    BOOLEAN Set = FALSE;
+
     DPRINT("_chmod('%s', %x)\n", filename, mode);
 
     FileAttributes = GetFileAttributesA(filename);
     if ( FileAttributes == -1 ) {
        _dosmaperr(GetLastError());
         return -1;
-       }
+    }
 
     if ( mode == 0 )
         return -1;
-
-    if ((mode & _S_IREAD) == _S_IREAD && (mode & _S_IWRITE) != _S_IWRITE)
-        FileAttributes &= FILE_ATTRIBUTE_READONLY;
-    else if (((mode & _S_IREAD) != _S_IREAD) && ((mode & _S_IWRITE) == _S_IWRITE))
-        FileAttributes &= FILE_ATTRIBUTE_NORMAL;
-    else
-        FileAttributes &= FILE_ATTRIBUTE_NORMAL;
-
-    if (SetFileAttributesA(filename, FileAttributes) == FALSE) {
-       _dosmaperr(GetLastError());
-        return -1;
+    
+    if (mode & _S_IWRITE) {
+       if (FileAttributes & FILE_ATTRIBUTE_READONLY) {
+           FileAttributes &= ~FILE_ATTRIBUTE_READONLY;
+           Set = TRUE;
        }
-
-    return 1;
+    } else {
+       if (!(FileAttributes & FILE_ATTRIBUTE_READONLY)) {
+           FileAttributes |= FILE_ATTRIBUTE_READONLY;
+           Set = TRUE;
+       }
+    }
+    if (Set && SetFileAttributesA(filename, FileAttributes) == FALSE) {
+        _dosmaperr(GetLastError());
+       return -1;
+    }
+    return 0;
 }
index 60f04eb..7ac0062 100644 (file)
 int _wchmod(const wchar_t* filename, mode_t mode)
 {
     DWORD FileAttributes = 0;
+    BOOLEAN Set = FALSE;
+
     DPRINT("_wchmod('%S', %x)\n", filename, mode);
 
     FileAttributes = GetFileAttributesW(filename);
     if ( FileAttributes == -1 ) {
-               _dosmaperr(GetLastError());
+       _dosmaperr(GetLastError());
         return -1;
-       }
+    }
 
     if ( mode == 0 )
         return -1;
 
-    if ((mode & _S_IREAD) == _S_IREAD && (mode & _S_IWRITE) != _S_IWRITE)
-        FileAttributes &= FILE_ATTRIBUTE_READONLY;
-    else if (((mode & _S_IREAD) != _S_IREAD) && ((mode & _S_IWRITE) == _S_IWRITE))
-        FileAttributes &= FILE_ATTRIBUTE_NORMAL;
-    else
-        FileAttributes &= FILE_ATTRIBUTE_NORMAL;
+    if (mode & _S_IWRITE) {
+       if (FileAttributes & FILE_ATTRIBUTE_READONLY) {
+           FileAttributes &= ~FILE_ATTRIBUTE_READONLY;
+           Set = TRUE;
+       }
+    } else {
+       if (!(FileAttributes & FILE_ATTRIBUTE_READONLY)) {
+           FileAttributes |= FILE_ATTRIBUTE_READONLY;
+           Set = TRUE;
+       }
+    }
 
-    if (SetFileAttributesW(filename, FileAttributes) == FALSE) {
-               _dosmaperr(GetLastError());
+    if (Set && SetFileAttributesW(filename, FileAttributes) == FALSE) {
+       _dosmaperr(GetLastError());
         return -1;
-       }
+    }
 
-    return 1;
+    return 0;
 }