Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Side by Side Diff: nspr/pr/src/md/windows/w95io.c

Issue 68173008: Update to NSPR 4.10.2. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/nss/
Patch Set: Update README.chromium Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « nspr/pr/src/md/windows/w95cv.c ('k') | nspr/pr/src/md/windows/w95sock.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public 2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 5
6 /* Windows 95 IO module 6 /* Windows 95 IO module
7 * 7 *
8 * Assumes synchronous I/O. 8 * Assumes synchronous I/O.
9 * 9 *
10 */ 10 */
11 11
12 #include "primpl.h" 12 #include "primpl.h"
13 #include <direct.h> 13 #include <direct.h>
14 #include <mbstring.h> 14 #include <mbstring.h>
15 #ifdef MOZ_UNICODE 15 #ifdef MOZ_UNICODE
16 #include <wchar.h> 16 #include <wchar.h>
17 #endif /* MOZ_UNICODE */ 17 #endif /* MOZ_UNICODE */
18 18
19 #ifdef WINCE
20
21 static HANDLE CreateFileA(LPCSTR lpFileName,
22 DWORD dwDesiredAccess,
23 DWORD dwShareMode,
24 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
25 DWORD dwCreationDisposition,
26 DWORD dwFlagsAndAttributes,
27 HANDLE hTemplateFile)
28 {
29 PRUnichar wFileName[MAX_PATH];
30 MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH);
31 return CreateFileW(wFileName, dwDesiredAccess, dwShareMode,
32 lpSecurityAttributes, dwCreationDisposition,
33 dwFlagsAndAttributes, hTemplateFile);
34 }
35
36 /*
37 * We seem to call FindFirstFileA and FindNextFileA just to get
38 * the file names in a directory listing. If so, we could define
39 * a custom WIN32_FIND_DATAA structure with just the cFileName
40 * member, and the CopyFindFileDataW2A function could just
41 * copy/convert the cFileName member.
42 */
43 static void CopyFindFileDataW2A(LPWIN32_FIND_DATAW from,
44 LPWIN32_FIND_DATAA to)
45 {
46 /*
47 * WIN32_FIND_DATAA and WIN32_FIND_DATAW are slightly different.
48 * The dwReserved0, dwReserved1, and cAlternateFileName members
49 * exist only in WIN32_FIND_DATAA. The dwOID member exists only
50 * in WIN32_FIND_DATAW.
51 */
52 to->dwFileAttributes = from->dwFileAttributes;
53 to->ftCreationTime = from->ftCreationTime;
54 to->ftLastAccessTime = from->ftLastAccessTime;
55 to->ftLastWriteTime = from->ftLastWriteTime;
56 to->nFileSizeHigh = from->nFileSizeHigh;
57 to->nFileSizeLow = from->nFileSizeLow;
58 to->dwReserved0 = 0;
59 to->dwReserved1 = 0;
60 WideCharToMultiByte(CP_ACP, 0, from->cFileName, -1,
61 to->cFileName, MAX_PATH, NULL, NULL);
62 to->cAlternateFileName[0] = '\0';
63 }
64
65 static HANDLE FindFirstFileA(LPCSTR lpFileName,
66 LPWIN32_FIND_DATAA lpFindFileData)
67 {
68 PRUnichar wFileName[MAX_PATH];
69 HANDLE hFindFile;
70 WIN32_FIND_DATAW wFindFileData;
71
72 MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH);
73 hFindFile = FindFirstFileW(wFileName, &wFindFileData);
74 if (hFindFile != INVALID_HANDLE_VALUE) {
75 CopyFindFileDataW2A(&wFindFileData, lpFindFileData);
76 }
77 return hFindFile;
78 }
79
80 static BOOL FindNextFileA(HANDLE hFindFile,
81 LPWIN32_FIND_DATAA lpFindFileData)
82 {
83 WIN32_FIND_DATAW wFindFileData;
84 BOOL rv;
85
86 rv = FindNextFileW(hFindFile, &wFindFileData);
87 if (rv) {
88 CopyFindFileDataW2A(&wFindFileData, lpFindFileData);
89 }
90 return rv;
91 }
92
93 static BOOL GetFileAttributesExA(LPCSTR lpFileName,
94 GET_FILEEX_INFO_LEVELS fInfoLevelId,
95 LPVOID lpFileInformation)
96 {
97 PRUnichar wFileName[MAX_PATH];
98 MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH);
99 return GetFileAttributesExW(wFileName, fInfoLevelId, lpFileInformation);
100 }
101
102 static BOOL DeleteFileA(LPCSTR lpFileName)
103 {
104 PRUnichar wFileName[MAX_PATH];
105 MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH);
106 return DeleteFileW(wFileName);
107 }
108
109 static BOOL MoveFileA(LPCSTR from, LPCSTR to)
110 {
111 PRUnichar wFrom[MAX_PATH];
112 PRUnichar wTo[MAX_PATH];
113 MultiByteToWideChar(CP_ACP, 0, from, -1, wFrom, MAX_PATH);
114 MultiByteToWideChar(CP_ACP, 0, to, -1, wTo, MAX_PATH);
115 return MoveFileW(wFrom, wTo);
116 }
117
118 static BOOL CreateDirectoryA(LPCSTR lpPathName,
119 LPSECURITY_ATTRIBUTES lpSecurityAttributes)
120 {
121 PRUnichar wPathName[MAX_PATH];
122 MultiByteToWideChar(CP_ACP, 0, lpPathName, -1, wPathName, MAX_PATH);
123 return CreateDirectoryW(wPathName, lpSecurityAttributes);
124 }
125
126 static BOOL RemoveDirectoryA(LPCSTR lpPathName)
127 {
128 PRUnichar wPathName[MAX_PATH];
129 MultiByteToWideChar(CP_ACP, 0, lpPathName, -1, wPathName, MAX_PATH);
130 return RemoveDirectoryW(wPathName);
131 }
132
133 static long GetDriveType(const char *lpRootPathName)
134 {
135 PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
136 return 0; // The drive type cannot be determined.
137 }
138
139 static DWORD GetFullPathName(const char *lpFileName,
140 DWORD nBufferLength,
141 const char *lpBuffer,
142 const char **lpFilePart)
143 {
144 // needs work dft
145 DWORD len = strlen(lpFileName);
146 if (len > nBufferLength)
147 return len;
148
149 strncpy((char *)lpBuffer, lpFileName, len);
150 ((char *)lpBuffer)[len] = '\0';
151
152 if (lpFilePart) {
153 char *sep = strrchr(lpBuffer, '\\');
154 if (sep) {
155 sep++; // pass the seperator
156 *lpFilePart = sep;
157 } else {
158 *lpFilePart = lpBuffer;
159 }
160 }
161 return len;
162 }
163
164 static BOOL LockFile(HANDLE hFile,
165 DWORD dwFileOffsetLow,
166 DWORD dwFileOffsetHigh,
167 DWORD nNumberOfBytesToLockLow,
168 DWORD nNumberOfBytesToLockHigh)
169 {
170 OVERLAPPED overlapped = {0};
171 overlapped.Offset = dwFileOffsetLow;
172 overlapped.OffsetHigh = dwFileOffsetHigh;
173 return LockFileEx(hFile,
174 LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY,
175 0, // reserved
176 nNumberOfBytesToLockLow,
177 nNumberOfBytesToLockHigh, &overlapped);
178 }
179
180 static BOOL UnlockFile(HANDLE hFile,
181 DWORD dwFileOffsetLow,
182 DWORD dwFileOffsetHigh,
183 DWORD nNumberOfBytesToUnlockLow,
184 DWORD nNumberOfBytesToUnlockHigh)
185 {
186 OVERLAPPED overlapped = {0};
187 overlapped.Offset = dwFileOffsetLow;
188 overlapped.OffsetHigh = dwFileOffsetHigh;
189 return UnlockFileEx(hFile,
190 0, // reserved
191 nNumberOfBytesToUnlockLow,
192 nNumberOfBytesToUnlockHigh, &overlapped);
193 }
194
195 static unsigned char *_mbsdec(const unsigned char *string1,
196 const unsigned char *string2)
197 {
198 // needs work dft
199 return NULL;
200 }
201
202 static unsigned char *_mbsinc(const unsigned char *inCurrent)
203 {
204 // needs work dft
205 return (unsigned char *)(inCurrent + 1);
206 }
207
208 #endif
209
210 struct _MDLock _pr_ioq_lock; 19 struct _MDLock _pr_ioq_lock;
211 20
212 /* 21 /*
213 * NSPR-to-NT access right mapping table for files. 22 * NSPR-to-NT access right mapping table for files.
214 */ 23 */
215 static DWORD fileAccessTable[] = { 24 static DWORD fileAccessTable[] = {
216 FILE_GENERIC_READ, 25 FILE_GENERIC_READ,
217 FILE_GENERIC_WRITE, 26 FILE_GENERIC_WRITE,
218 FILE_GENERIC_EXECUTE 27 FILE_GENERIC_EXECUTE
219 }; 28 };
220 29
221 /* 30 /*
222 * NSPR-to-NT access right mapping table for directories. 31 * NSPR-to-NT access right mapping table for directories.
223 */ 32 */
224 static DWORD dirAccessTable[] = { 33 static DWORD dirAccessTable[] = {
225 FILE_GENERIC_READ, 34 FILE_GENERIC_READ,
226 FILE_GENERIC_WRITE|FILE_DELETE_CHILD, 35 FILE_GENERIC_WRITE|FILE_DELETE_CHILD,
227 FILE_GENERIC_EXECUTE 36 FILE_GENERIC_EXECUTE
228 }; 37 };
229 38
230 /* Windows CE has GetFileAttributesEx. */
231 #ifndef WINCE
232 typedef BOOL (WINAPI *GetFileAttributesExFn)(LPCTSTR,
233 GET_FILEEX_INFO_LEVELS,
234 LPVOID);
235 static GetFileAttributesExFn getFileAttributesEx;
236 static void InitGetFileInfo(void);
237 #endif
238
239 static void InitUnicodeSupport(void);
240
241 static PRBool IsPrevCharSlash(const char *str, const char *current); 39 static PRBool IsPrevCharSlash(const char *str, const char *current);
242 40
243 void 41 void
244 _PR_MD_INIT_IO() 42 _PR_MD_INIT_IO()
245 { 43 {
246 WORD WSAVersion = 0x0101; 44 WORD WSAVersion = 0x0101;
247 WSADATA WSAData; 45 WSADATA WSAData;
248 int err; 46 int err;
249 47
250 err = WSAStartup( WSAVersion, &WSAData ); 48 err = WSAStartup( WSAVersion, &WSAData );
(...skipping 19 matching lines...) Expand all
270 systime.wMilliseconds = 0; 68 systime.wMilliseconds = 0;
271 69
272 rv = SystemTimeToFileTime(&systime, &filetime.ft); 70 rv = SystemTimeToFileTime(&systime, &filetime.ft);
273 PR_ASSERT(0 != rv); 71 PR_ASSERT(0 != rv);
274 PR_ASSERT(filetime.prt == _pr_filetime_offset); 72 PR_ASSERT(filetime.prt == _pr_filetime_offset);
275 } 73 }
276 #endif /* DEBUG */ 74 #endif /* DEBUG */
277 75
278 _PR_NT_InitSids(); 76 _PR_NT_InitSids();
279 77
280 #ifndef WINCE
281 InitGetFileInfo();
282 #endif
283
284 InitUnicodeSupport();
285
286 _PR_MD_InitSockets(); 78 _PR_MD_InitSockets();
287 } 79 }
288 80
289 PRStatus 81 PRStatus
290 _PR_MD_WAIT(PRThread *thread, PRIntervalTime ticks) 82 _PR_MD_WAIT(PRThread *thread, PRIntervalTime ticks)
291 { 83 {
292 DWORD rv; 84 DWORD rv;
293 85
294 PRUint32 msecs = (ticks == PR_INTERVAL_NO_TIMEOUT) ? 86 PRUint32 msecs = (ticks == PR_INTERVAL_NO_TIMEOUT) ?
295 INFINITE : PR_IntervalToMilliseconds(ticks); 87 INFINITE : PR_IntervalToMilliseconds(ticks);
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 * microseconds to milliseconds before doing the comparison. 580 * microseconds to milliseconds before doing the comparison.
789 */ 581 */
790 PR_ASSERT((cmp / PR_USEC_PER_MSEC) == (*prtm / PR_USEC_PER_MSEC)); 582 PR_ASSERT((cmp / PR_USEC_PER_MSEC) == (*prtm / PR_USEC_PER_MSEC));
791 } 583 }
792 #endif /* DEBUG */ 584 #endif /* DEBUG */
793 } 585 }
794 586
795 PRInt32 587 PRInt32
796 _PR_MD_STAT(const char *fn, struct stat *info) 588 _PR_MD_STAT(const char *fn, struct stat *info)
797 { 589 {
798 #ifdef WINCE
799 // needs work. dft
800 PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
801 return -1;
802 #else
803 PRInt32 rv; 590 PRInt32 rv;
804 591
805 rv = _stat(fn, (struct _stat *)info); 592 rv = _stat(fn, (struct _stat *)info);
806 if (-1 == rv) { 593 if (-1 == rv) {
807 /* 594 /*
808 * Check for MSVC runtime library _stat() bug. 595 * Check for MSVC runtime library _stat() bug.
809 * (It's really a bug in FindFirstFile().) 596 * (It's really a bug in FindFirstFile().)
810 * If a pathname ends in a backslash or slash, 597 * If a pathname ends in a backslash or slash,
811 * e.g., c:\temp\ or c:/temp/, _stat() will fail. 598 * e.g., c:\temp\ or c:/temp/, _stat() will fail.
812 * Note: a pathname ending in a slash (e.g., c:/temp/) 599 * Note: a pathname ending in a slash (e.g., c:/temp/)
(...skipping 11 matching lines...) Expand all
824 strcpy(newfn, fn); 611 strcpy(newfn, fn);
825 newfn[len - 1] = '\0'; 612 newfn[len - 1] = '\0';
826 rv = _stat(newfn, (struct _stat *)info); 613 rv = _stat(newfn, (struct _stat *)info);
827 } 614 }
828 } 615 }
829 616
830 if (-1 == rv) { 617 if (-1 == rv) {
831 _PR_MD_MAP_STAT_ERROR(errno); 618 _PR_MD_MAP_STAT_ERROR(errno);
832 } 619 }
833 return rv; 620 return rv;
834 #endif
835 } 621 }
836 622
837 #define _PR_IS_SLASH(ch) ((ch) == '/' || (ch) == '\\') 623 #define _PR_IS_SLASH(ch) ((ch) == '/' || (ch) == '\\')
838 624
839 static PRBool 625 static PRBool
840 IsPrevCharSlash(const char *str, const char *current) 626 IsPrevCharSlash(const char *str, const char *current)
841 { 627 {
842 const char *prev; 628 const char *prev;
843 629
844 if (str >= current) 630 if (str >= current)
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 } 714 }
929 rv = GetDriveType(fn) > 1 ? PR_TRUE : PR_FALSE; 715 rv = GetDriveType(fn) > 1 ? PR_TRUE : PR_FALSE;
930 /* restore the 'fn' buffer */ 716 /* restore the 'fn' buffer */
931 if (slashAdded) { 717 if (slashAdded) {
932 *--p = '\0'; 718 *--p = '\0';
933 } 719 }
934 } 720 }
935 return rv; 721 return rv;
936 } 722 }
937 723
938 #ifndef WINCE
939 /*
940 * InitGetFileInfo --
941 *
942 * Called during IO init. Checks for the existence of the system function
943 * GetFileAttributeEx, which when available is used in GETFILEINFO calls.
944 * If the routine exists, then the address of the routine is stored in the
945 * variable getFileAttributesEx, which will be used to call the routine.
946 */
947 static void InitGetFileInfo(void)
948 {
949 HMODULE module;
950 module = GetModuleHandle("Kernel32.dll");
951 if (!module) {
952 PR_LOG(_pr_io_lm, PR_LOG_DEBUG,
953 ("InitGetFileInfo: GetModuleHandle() failed: %d",
954 GetLastError()));
955 return;
956 }
957
958 getFileAttributesEx = (GetFileAttributesExFn)
959 GetProcAddress(module, "GetFileAttributesExA");
960 }
961
962 /*
963 * If GetFileAttributeEx doesn't exist, we call FindFirstFile as a
964 * fallback.
965 */
966 static BOOL
967 GetFileAttributesExFB(const char *fn, WIN32_FIND_DATA *findFileData)
968 {
969 HANDLE hFindFile;
970
971 /*
972 * FindFirstFile() expands wildcard characters. So
973 * we make sure the pathname contains no wildcard.
974 */
975 if (NULL != _mbspbrk(fn, "?*")) {
976 SetLastError(ERROR_INVALID_NAME);
977 return FALSE;
978 }
979
980 hFindFile = FindFirstFile(fn, findFileData);
981 if (INVALID_HANDLE_VALUE == hFindFile) {
982 DWORD len;
983 char *filePart;
984 char pathbuf[MAX_PATH + 1];
985
986 /*
987 * FindFirstFile() does not work correctly on root directories.
988 * It also doesn't work correctly on a pathname that ends in a
989 * slash. So we first check to see if the pathname specifies a
990 * root directory. If not, and if the pathname ends in a slash,
991 * we remove the final slash and try again.
992 */
993
994 /*
995 * If the pathname does not contain ., \, and /, it cannot be
996 * a root directory or a pathname that ends in a slash.
997 */
998 if (NULL == _mbspbrk(fn, ".\\/")) {
999 return FALSE;
1000 }
1001 len = GetFullPathName(fn, sizeof(pathbuf), pathbuf,
1002 &filePart);
1003 if (0 == len) {
1004 return FALSE;
1005 }
1006 if (len > sizeof(pathbuf)) {
1007 SetLastError(ERROR_FILENAME_EXCED_RANGE);
1008 return FALSE;
1009 }
1010 if (IsRootDirectory(pathbuf, sizeof(pathbuf))) {
1011 findFileData->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
1012 /* The file size doesn't have a meaning for directories. */
1013 findFileData->nFileSizeHigh = 0;
1014 findFileData->nFileSizeLow = 0;
1015 /*
1016 * For a directory, these timestamps all specify when the
1017 * directory is created. The creation time doesn't make
1018 * sense for root directories, so we set it to (NSPR) time 0.
1019 */
1020 memcpy(&findFileData->ftCreationTime, &_pr_filetime_offset, 8);
1021 findFileData->ftLastAccessTime = findFileData->ftCreationTime;
1022 findFileData->ftLastWriteTime = findFileData->ftCreationTime;
1023 return TRUE;
1024 }
1025 if (!IsPrevCharSlash(pathbuf, pathbuf + len)) {
1026 return FALSE;
1027 } else {
1028 pathbuf[len - 1] = '\0';
1029 hFindFile = FindFirstFile(pathbuf, findFileData);
1030 if (INVALID_HANDLE_VALUE == hFindFile) {
1031 return FALSE;
1032 }
1033 }
1034 }
1035
1036 FindClose(hFindFile);
1037 return TRUE;
1038 }
1039 #endif
1040
1041 PRInt32 724 PRInt32
1042 _PR_MD_GETFILEINFO64(const char *fn, PRFileInfo64 *info) 725 _PR_MD_GETFILEINFO64(const char *fn, PRFileInfo64 *info)
1043 { 726 {
1044 #ifdef WINCE
1045 WIN32_FILE_ATTRIBUTE_DATA findFileData; 727 WIN32_FILE_ATTRIBUTE_DATA findFileData;
1046 #else
1047 WIN32_FIND_DATA findFileData;
1048 #endif
1049 BOOL rv; 728 BOOL rv;
1050 729
1051 if (NULL == fn || '\0' == *fn) { 730 if (NULL == fn || '\0' == *fn) {
1052 PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); 731 PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
1053 return -1; 732 return -1;
1054 } 733 }
1055 734
1056 #ifdef WINCE 735 rv = GetFileAttributesEx(fn, GetFileExInfoStandard, &findFileData);
1057 rv = GetFileAttributesExA(fn, GetFileExInfoStandard, &findFileData);
1058 #else
1059 /* GetFileAttributesEx is supported on Win 2K and up. */
1060 if (getFileAttributesEx) {
1061 rv = getFileAttributesEx(fn, GetFileExInfoStandard, &findFileData);
1062 } else {
1063 rv = GetFileAttributesExFB(fn, &findFileData);
1064 }
1065 #endif
1066 if (!rv) { 736 if (!rv) {
1067 _PR_MD_MAP_OPENDIR_ERROR(GetLastError()); 737 _PR_MD_MAP_OPENDIR_ERROR(GetLastError());
1068 return -1; 738 return -1;
1069 } 739 }
1070 740
1071 if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 741 if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
1072 info->type = PR_FILE_DIRECTORY; 742 info->type = PR_FILE_DIRECTORY;
1073 } else { 743 } else {
1074 info->type = PR_FILE_FILE; 744 info->type = PR_FILE_FILE;
1075 } 745 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 info->modifyTime = info64.modifyTime; 813 info->modifyTime = info64.modifyTime;
1144 info->creationTime = info64.creationTime; 814 info->creationTime = info64.creationTime;
1145 LL_L2I(info->size, info64.size); 815 LL_L2I(info->size, info64.size);
1146 } 816 }
1147 return rv; 817 return rv;
1148 } 818 }
1149 819
1150 PRStatus 820 PRStatus
1151 _PR_MD_SET_FD_INHERITABLE(PRFileDesc *fd, PRBool inheritable) 821 _PR_MD_SET_FD_INHERITABLE(PRFileDesc *fd, PRBool inheritable)
1152 { 822 {
1153 #ifdef WINCE
1154 PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
1155 return PR_FAILURE;
1156 #else
1157 BOOL rv; 823 BOOL rv;
1158 824
1159 /* 825 /*
1160 * The SetHandleInformation function fails with the 826 * The SetHandleInformation function fails with the
1161 * ERROR_CALL_NOT_IMPLEMENTED error on Win95. 827 * ERROR_CALL_NOT_IMPLEMENTED error on Win95.
1162 */ 828 */
1163 rv = SetHandleInformation( 829 rv = SetHandleInformation(
1164 (HANDLE)fd->secret->md.osfd, 830 (HANDLE)fd->secret->md.osfd,
1165 HANDLE_FLAG_INHERIT, 831 HANDLE_FLAG_INHERIT,
1166 inheritable ? HANDLE_FLAG_INHERIT : 0); 832 inheritable ? HANDLE_FLAG_INHERIT : 0);
1167 if (0 == rv) { 833 if (0 == rv) {
1168 _PR_MD_MAP_DEFAULT_ERROR(GetLastError()); 834 _PR_MD_MAP_DEFAULT_ERROR(GetLastError());
1169 return PR_FAILURE; 835 return PR_FAILURE;
1170 } 836 }
1171 return PR_SUCCESS; 837 return PR_SUCCESS;
1172 #endif
1173 } 838 }
1174 839
1175 void 840 void
1176 _PR_MD_INIT_FD_INHERITABLE(PRFileDesc *fd, PRBool imported) 841 _PR_MD_INIT_FD_INHERITABLE(PRFileDesc *fd, PRBool imported)
1177 { 842 {
1178 if (imported) { 843 if (imported) {
1179 fd->secret->inheritable = _PR_TRI_UNKNOWN; 844 fd->secret->inheritable = _PR_TRI_UNKNOWN;
1180 } else { 845 } else {
1181 fd->secret->inheritable = _PR_TRI_FALSE; 846 fd->secret->inheritable = _PR_TRI_FALSE;
1182 } 847 }
1183 } 848 }
1184 849
1185 void 850 void
1186 _PR_MD_QUERY_FD_INHERITABLE(PRFileDesc *fd) 851 _PR_MD_QUERY_FD_INHERITABLE(PRFileDesc *fd)
1187 { 852 {
1188 #ifdef WINCE
1189 fd->secret->inheritable = _PR_TRI_FALSE;
1190 #else
1191 DWORD flags; 853 DWORD flags;
1192 854
1193 PR_ASSERT(_PR_TRI_UNKNOWN == fd->secret->inheritable); 855 PR_ASSERT(_PR_TRI_UNKNOWN == fd->secret->inheritable);
1194 if (GetHandleInformation((HANDLE)fd->secret->md.osfd, &flags)) { 856 if (GetHandleInformation((HANDLE)fd->secret->md.osfd, &flags)) {
1195 if (flags & HANDLE_FLAG_INHERIT) { 857 if (flags & HANDLE_FLAG_INHERIT) {
1196 fd->secret->inheritable = _PR_TRI_TRUE; 858 fd->secret->inheritable = _PR_TRI_TRUE;
1197 } else { 859 } else {
1198 fd->secret->inheritable = _PR_TRI_FALSE; 860 fd->secret->inheritable = _PR_TRI_FALSE;
1199 } 861 }
1200 } 862 }
1201 #endif
1202 } 863 }
1203 864
1204 PRInt32 865 PRInt32
1205 _PR_MD_RENAME(const char *from, const char *to) 866 _PR_MD_RENAME(const char *from, const char *to)
1206 { 867 {
1207 /* Does this work with dot-relative pathnames? */ 868 /* Does this work with dot-relative pathnames? */
1208 if (MoveFileA(from, to)) { 869 if (MoveFileA(from, to)) {
1209 return 0; 870 return 0;
1210 } else { 871 } else {
1211 _PR_MD_MAP_RENAME_ERROR(GetLastError()); 872 _PR_MD_MAP_RENAME_ERROR(GetLastError());
1212 return -1; 873 return -1;
1213 } 874 }
1214 } 875 }
1215 876
1216 PRInt32 877 PRInt32
1217 _PR_MD_ACCESS(const char *name, PRAccessHow how) 878 _PR_MD_ACCESS(const char *name, PRAccessHow how)
1218 { 879 {
1219 #ifdef WINCE
1220 PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
1221 return -1;
1222 #else
1223 PRInt32 rv; 880 PRInt32 rv;
1224 switch (how) { 881 switch (how) {
1225 case PR_ACCESS_WRITE_OK: 882 case PR_ACCESS_WRITE_OK:
1226 rv = _access(name, 02); 883 rv = _access(name, 02);
1227 break; 884 break;
1228 case PR_ACCESS_READ_OK: 885 case PR_ACCESS_READ_OK:
1229 rv = _access(name, 04); 886 rv = _access(name, 04);
1230 break; 887 break;
1231 case PR_ACCESS_EXISTS: 888 case PR_ACCESS_EXISTS:
1232 return _access(name, 00); 889 return _access(name, 00);
1233 break; 890 break;
1234 default: 891 default:
1235 PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); 892 PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
1236 return -1; 893 return -1;
1237 } 894 }
1238 if (rv < 0) 895 if (rv < 0)
1239 _PR_MD_MAP_ACCESS_ERROR(errno); 896 _PR_MD_MAP_ACCESS_ERROR(errno);
1240 return rv; 897 return rv;
1241 #endif
1242 } 898 }
1243 899
1244 PRInt32 900 PRInt32
1245 _PR_MD_MKDIR(const char *name, PRIntn mode) 901 _PR_MD_MKDIR(const char *name, PRIntn mode)
1246 { 902 {
1247 /* XXXMB - how to translate the "mode"??? */ 903 /* XXXMB - how to translate the "mode"??? */
1248 if (CreateDirectoryA(name, NULL)) { 904 if (CreateDirectoryA(name, NULL)) {
1249 return 0; 905 return 0;
1250 } else { 906 } else {
1251 _PR_MD_MAP_MKDIR_ERROR(GetLastError()); 907 _PR_MD_MAP_MKDIR_ERROR(GetLastError());
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1357 static FindFirstFileWFn findFirstFileW = FindFirstFileW; 1013 static FindFirstFileWFn findFirstFileW = FindFirstFileW;
1358 typedef BOOL (WINAPI *FindNextFileWFn) (HANDLE, LPWIN32_FIND_DATAW); 1014 typedef BOOL (WINAPI *FindNextFileWFn) (HANDLE, LPWIN32_FIND_DATAW);
1359 static FindNextFileWFn findNextFileW = FindNextFileW; 1015 static FindNextFileWFn findNextFileW = FindNextFileW;
1360 typedef DWORD (WINAPI *GetFullPathNameWFn) (LPCWSTR, DWORD, LPWSTR, LPWSTR *); 1016 typedef DWORD (WINAPI *GetFullPathNameWFn) (LPCWSTR, DWORD, LPWSTR, LPWSTR *);
1361 static GetFullPathNameWFn getFullPathNameW = GetFullPathNameW; 1017 static GetFullPathNameWFn getFullPathNameW = GetFullPathNameW;
1362 typedef UINT (WINAPI *GetDriveTypeWFn) (LPCWSTR); 1018 typedef UINT (WINAPI *GetDriveTypeWFn) (LPCWSTR);
1363 static GetDriveTypeWFn getDriveTypeW = GetDriveTypeW; 1019 static GetDriveTypeWFn getDriveTypeW = GetDriveTypeW;
1364 1020
1365 #endif /* MOZ_UNICODE */ 1021 #endif /* MOZ_UNICODE */
1366 1022
1367 PRBool _pr_useUnicode = PR_FALSE;
1368
1369 static void InitUnicodeSupport(void)
1370 {
1371 #ifdef WINCE
1372 /* The A functions don't even exist in Windows Mobile. */
1373 _pr_useUnicode = PR_TRUE;
1374 #else
1375 /*
1376 * The W functions exist on Win9x as stubs that fail with the
1377 * ERROR_CALL_NOT_IMPLEMENTED error. We plan to emulate the
1378 * MSLU W functions on Win9x in the future.
1379 */
1380
1381 /* Find out if we are running on a Unicode enabled version of Windows */
1382 OSVERSIONINFOA osvi = {0};
1383
1384 osvi.dwOSVersionInfoSize = sizeof(osvi);
1385 if (GetVersionExA(&osvi)) {
1386 _pr_useUnicode = (osvi.dwPlatformId >= VER_PLATFORM_WIN32_NT);
1387 } else {
1388 _pr_useUnicode = PR_FALSE;
1389 }
1390 #ifdef DEBUG
1391 /*
1392 * In debug builds, allow explicit use of ANSI methods to simulate
1393 * a Win9x environment for testing purposes.
1394 */
1395 if (getenv("WINAPI_USE_ANSI"))
1396 _pr_useUnicode = PR_FALSE;
1397 #endif
1398 #endif
1399 }
1400
1401 #ifdef MOZ_UNICODE 1023 #ifdef MOZ_UNICODE
1402 1024
1403 /* ================ UTF16 Interfaces ================================ */ 1025 /* ================ UTF16 Interfaces ================================ */
1404 static void FlipSlashesW(PRUnichar *cp, size_t len) 1026 static void FlipSlashesW(PRUnichar *cp, size_t len)
1405 { 1027 {
1406 while (len-- > 0) { 1028 while (len-- > 0) {
1407 if (cp[0] == L'/') { 1029 if (cp[0] == L'/') {
1408 cp[0] = L'\\'; 1030 cp[0] = L'\\';
1409 } 1031 }
1410 cp++; 1032 cp++;
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
1744 info->creationTime = info->modifyTime; 1366 info->creationTime = info->modifyTime;
1745 } else { 1367 } else {
1746 _PR_FileTimeToPRTime(&findFileData.ftCreationTime, 1368 _PR_FileTimeToPRTime(&findFileData.ftCreationTime,
1747 &info->creationTime); 1369 &info->creationTime);
1748 } 1370 }
1749 1371
1750 return 0; 1372 return 0;
1751 } 1373 }
1752 /* ================ end of UTF16 Interfaces ================================ */ 1374 /* ================ end of UTF16 Interfaces ================================ */
1753 #endif /* MOZ_UNICODE */ 1375 #endif /* MOZ_UNICODE */
OLDNEW
« no previous file with comments | « nspr/pr/src/md/windows/w95cv.c ('k') | nspr/pr/src/md/windows/w95sock.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698