1 /* |
1 /* |
2 * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. |
2 * Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. Sun designates this |
7 * published by the Free Software Foundation. Sun designates this |
143 munmap(a, (size_t)len), |
142 munmap(a, (size_t)len), |
144 "Unmap failed"); |
143 "Unmap failed"); |
145 } |
144 } |
146 |
145 |
147 |
146 |
148 JNIEXPORT jint JNICALL |
|
149 Java_sun_nio_ch_FileChannelImpl_truncate0(JNIEnv *env, jobject this, |
|
150 jobject fdo, jlong size) |
|
151 { |
|
152 return handle(env, |
|
153 ftruncate64(fdval(env, fdo), size), |
|
154 "Truncation failed"); |
|
155 } |
|
156 |
|
157 |
|
158 JNIEXPORT jint JNICALL |
|
159 Java_sun_nio_ch_FileChannelImpl_force0(JNIEnv *env, jobject this, |
|
160 jobject fdo, jboolean md) |
|
161 { |
|
162 jint fd = fdval(env, fdo); |
|
163 int result = 0; |
|
164 |
|
165 if (md == JNI_FALSE) { |
|
166 result = fdatasync(fd); |
|
167 } else { |
|
168 result = fsync(fd); |
|
169 } |
|
170 return handle(env, result, "Force failed"); |
|
171 } |
|
172 |
|
173 |
|
174 JNIEXPORT jlong JNICALL |
147 JNIEXPORT jlong JNICALL |
175 Java_sun_nio_ch_FileChannelImpl_position0(JNIEnv *env, jobject this, |
148 Java_sun_nio_ch_FileChannelImpl_position0(JNIEnv *env, jobject this, |
176 jobject fdo, jlong offset) |
149 jobject fdo, jlong offset) |
177 { |
150 { |
178 jint fd = fdval(env, fdo); |
151 jint fd = fdval(env, fdo); |
182 result = lseek64(fd, 0, SEEK_CUR); |
155 result = lseek64(fd, 0, SEEK_CUR); |
183 } else { |
156 } else { |
184 result = lseek64(fd, offset, SEEK_SET); |
157 result = lseek64(fd, offset, SEEK_SET); |
185 } |
158 } |
186 return handle(env, result, "Position failed"); |
159 return handle(env, result, "Position failed"); |
187 } |
|
188 |
|
189 |
|
190 JNIEXPORT jlong JNICALL |
|
191 Java_sun_nio_ch_FileChannelImpl_size0(JNIEnv *env, jobject this, jobject fdo) |
|
192 { |
|
193 struct stat64 fbuf; |
|
194 |
|
195 if (fstat64(fdval(env, fdo), &fbuf) < 0) |
|
196 return handle(env, -1, "Size failed"); |
|
197 return fbuf.st_size; |
|
198 } |
160 } |
199 |
161 |
200 |
162 |
201 JNIEXPORT void JNICALL |
163 JNIEXPORT void JNICALL |
202 Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo) |
164 Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo) |
278 } |
240 } |
279 return result; |
241 return result; |
280 } |
242 } |
281 #endif |
243 #endif |
282 } |
244 } |
283 |
|
284 JNIEXPORT jint JNICALL |
|
285 Java_sun_nio_ch_FileChannelImpl_lock0(JNIEnv *env, jobject this, jobject fdo, |
|
286 jboolean block, jlong pos, jlong size, |
|
287 jboolean shared) |
|
288 { |
|
289 jint fd = fdval(env, fdo); |
|
290 jint lockResult = 0; |
|
291 int cmd = 0; |
|
292 struct flock64 fl; |
|
293 |
|
294 fl.l_whence = SEEK_SET; |
|
295 if (size == (jlong)java_lang_Long_MAX_VALUE) { |
|
296 fl.l_len = (off64_t)0; |
|
297 } else { |
|
298 fl.l_len = (off64_t)size; |
|
299 } |
|
300 fl.l_start = (off64_t)pos; |
|
301 if (shared == JNI_TRUE) { |
|
302 fl.l_type = F_RDLCK; |
|
303 } else { |
|
304 fl.l_type = F_WRLCK; |
|
305 } |
|
306 if (block == JNI_TRUE) { |
|
307 cmd = F_SETLKW64; |
|
308 } else { |
|
309 cmd = F_SETLK64; |
|
310 } |
|
311 lockResult = fcntl(fd, cmd, &fl); |
|
312 if (lockResult < 0) { |
|
313 if ((cmd == F_SETLK64) && (errno == EAGAIN)) |
|
314 return sun_nio_ch_FileChannelImpl_NO_LOCK; |
|
315 if (errno == EINTR) |
|
316 return sun_nio_ch_FileChannelImpl_INTERRUPTED; |
|
317 JNU_ThrowIOExceptionWithLastError(env, "Lock failed"); |
|
318 } |
|
319 return 0; |
|
320 } |
|
321 |
|
322 |
|
323 JNIEXPORT void JNICALL |
|
324 Java_sun_nio_ch_FileChannelImpl_release0(JNIEnv *env, jobject this, |
|
325 jobject fdo, jlong pos, jlong size) |
|
326 { |
|
327 jint fd = fdval(env, fdo); |
|
328 jint lockResult = 0; |
|
329 struct flock64 fl; |
|
330 int cmd = F_SETLK64; |
|
331 |
|
332 fl.l_whence = SEEK_SET; |
|
333 if (size == (jlong)java_lang_Long_MAX_VALUE) { |
|
334 fl.l_len = (off64_t)0; |
|
335 } else { |
|
336 fl.l_len = (off64_t)size; |
|
337 } |
|
338 fl.l_start = (off64_t)pos; |
|
339 fl.l_type = F_UNLCK; |
|
340 lockResult = fcntl(fd, cmd, &fl); |
|
341 if (lockResult < 0) { |
|
342 JNU_ThrowIOExceptionWithLastError(env, "Release failed"); |
|
343 } |
|
344 } |
|