1 /*
2 * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
84 #endif
85
86 /*
87 * The ZFILE_* functions exist to provide some platform-independence with
88 * respect to file access needs.
89 */
90
91 /*
92 * Opens the named file for reading, returning a ZFILE.
93 *
94 * Compare this with winFileHandleOpen in windows/native/java/io/io_util_md.c.
95 * This function does not take JNIEnv* and uses CreateFile (instead of
96 * CreateFileW). The expectation is that this function will be called only
97 * from ZIP_Open_Generic, which in turn is used by the JVM, where we do not
98 * need to concern ourselves with wide chars.
99 */
100 static ZFILE
101 ZFILE_Open(const char *fname, int flags) {
102 #ifdef WIN32
103 WCHAR *wfname, *wprefixed_fname;
104 size_t converted_chars, fname_length;
105 jlong fhandle;
106 const DWORD access =
107 (flags & O_RDWR) ? (GENERIC_WRITE | GENERIC_READ) :
108 (flags & O_WRONLY) ? GENERIC_WRITE :
109 GENERIC_READ;
110 const DWORD sharing =
111 FILE_SHARE_READ | FILE_SHARE_WRITE;
112 const DWORD disposition =
113 /* Note: O_TRUNC overrides O_CREAT */
114 (flags & O_TRUNC) ? CREATE_ALWAYS :
115 (flags & O_CREAT) ? OPEN_ALWAYS :
116 OPEN_EXISTING;
117 const DWORD maybeWriteThrough =
118 (flags & (O_SYNC | O_DSYNC)) ?
119 FILE_FLAG_WRITE_THROUGH :
120 FILE_ATTRIBUTE_NORMAL;
121 const DWORD maybeDeleteOnClose =
122 (flags & O_TEMPORARY) ?
123 FILE_FLAG_DELETE_ON_CLOSE :
124 FILE_ATTRIBUTE_NORMAL;
125 const DWORD flagsAndAttributes = maybeWriteThrough | maybeDeleteOnClose;
126
127 fname_length = strlen(fname);
128 if (fname_length < MAX_PATH) {
129 return (jlong)CreateFile(
130 fname, /* path name in multibyte char */
131 access, /* Read and/or write permission */
132 sharing, /* File sharing flags */
133 NULL, /* Security attributes */
134 disposition, /* creation disposition */
135 flagsAndAttributes, /* flags and attributes */
136 NULL);
137 } else {
138 if ((wfname = (WCHAR*)malloc((fname_length + 1) * sizeof(WCHAR))) == NULL)
139 return (jlong)INVALID_HANDLE_VALUE;
140
141 if (mbstowcs_s(&converted_chars, wfname, fname_length + 1, fname, fname_length) != 0) {
142 free(wfname);
143 return (jlong)INVALID_HANDLE_VALUE;
144 }
145 wprefixed_fname = getPrefixed(wfname, (int)fname_length);
146 fhandle = (jlong)CreateFileW(
147 wprefixed_fname, /* Wide char path name */
148 access, /* Read and/or write permission */
149 sharing, /* File sharing flags */
150 NULL, /* Security attributes */
151 disposition, /* creation disposition */
152 flagsAndAttributes, /* flags and attributes */
153 NULL);
154 free(wfname);
155 free(wprefixed_fname);
156 return fhandle;
157 }
158 #else
159 return open(fname, flags, 0);
160 #endif
161 }
162
|
1 /*
2 * Copyright (c) 1995, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
84 #endif
85
86 /*
87 * The ZFILE_* functions exist to provide some platform-independence with
88 * respect to file access needs.
89 */
90
91 /*
92 * Opens the named file for reading, returning a ZFILE.
93 *
94 * Compare this with winFileHandleOpen in windows/native/java/io/io_util_md.c.
95 * This function does not take JNIEnv* and uses CreateFile (instead of
96 * CreateFileW). The expectation is that this function will be called only
97 * from ZIP_Open_Generic, which in turn is used by the JVM, where we do not
98 * need to concern ourselves with wide chars.
99 */
100 static ZFILE
101 ZFILE_Open(const char *fname, int flags) {
102 #ifdef WIN32
103 WCHAR *wfname, *wprefixed_fname;
104 size_t fname_length;
105 jlong fhandle;
106 const DWORD access =
107 (flags & O_RDWR) ? (GENERIC_WRITE | GENERIC_READ) :
108 (flags & O_WRONLY) ? GENERIC_WRITE :
109 GENERIC_READ;
110 const DWORD sharing =
111 FILE_SHARE_READ | FILE_SHARE_WRITE;
112 const DWORD disposition =
113 /* Note: O_TRUNC overrides O_CREAT */
114 (flags & O_TRUNC) ? CREATE_ALWAYS :
115 (flags & O_CREAT) ? OPEN_ALWAYS :
116 OPEN_EXISTING;
117 const DWORD maybeWriteThrough =
118 (flags & (O_SYNC | O_DSYNC)) ?
119 FILE_FLAG_WRITE_THROUGH :
120 FILE_ATTRIBUTE_NORMAL;
121 const DWORD maybeDeleteOnClose =
122 (flags & O_TEMPORARY) ?
123 FILE_FLAG_DELETE_ON_CLOSE :
124 FILE_ATTRIBUTE_NORMAL;
125 const DWORD flagsAndAttributes = maybeWriteThrough | maybeDeleteOnClose;
126
127 fname_length = strlen(fname);
128 if (fname_length < MAX_PATH) {
129 return (jlong)CreateFile(
130 fname, /* path name in multibyte char */
131 access, /* Read and/or write permission */
132 sharing, /* File sharing flags */
133 NULL, /* Security attributes */
134 disposition, /* creation disposition */
135 flagsAndAttributes, /* flags and attributes */
136 NULL);
137 } else {
138 /* Get required buffer size to convert to Unicode */
139 int wfname_len = MultiByteToWideChar(CP_THREAD_ACP, MB_ERR_INVALID_CHARS,
140 fname, -1, NULL, 0);
141 if (wfname_len == 0) {
142 return (jlong)INVALID_HANDLE_VALUE;
143 }
144 if ((wfname = (WCHAR*)malloc(wfname_len * sizeof(WCHAR))) == NULL) {
145 return (jlong)INVALID_HANDLE_VALUE;
146 }
147 if (MultiByteToWideChar(CP_THREAD_ACP, MB_ERR_INVALID_CHARS,
148 fname, -1, wfname, wfname_len) == 0) {
149 return (jlong)INVALID_HANDLE_VALUE;
150 }
151 wprefixed_fname = getPrefixed(wfname, (int)fname_length);
152 fhandle = (jlong)CreateFileW(
153 wprefixed_fname, /* Wide char path name */
154 access, /* Read and/or write permission */
155 sharing, /* File sharing flags */
156 NULL, /* Security attributes */
157 disposition, /* creation disposition */
158 flagsAndAttributes, /* flags and attributes */
159 NULL);
160 free(wfname);
161 free(wprefixed_fname);
162 return fhandle;
163 }
164 #else
165 return open(fname, flags, 0);
166 #endif
167 }
168
|