src/solaris/native/java/io/io_util_md.c

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 27,36 **** --- 27,45 ---- #include "jni_util.h" #include "jvm.h" #include "io_util.h" #include "io_util_md.h" #include <string.h> + #include <unistd.h> + + #ifdef __solaris__ + #include <sys/filio.h> + #endif + + #if defined(__linux__) || defined(_ALLBSD_SOURCE) + #include <sys/ioctl.h> + #endif #ifdef MACOSX #include <CoreFoundation/CoreFoundation.h>
*** 60,69 **** --- 69,100 ---- } return rv; } #endif + FD + handleOpen(const char *path, int oflag, int mode) { + FD fd; + RESTARTABLE(open64(path, oflag, mode), fd); + if (fd != -1) { + struct stat64 buf64; + int result; + RESTARTABLE(fstat64(fd, &buf64), result); + if (result != -1) { + if (S_ISDIR(buf64.st_mode)) { + close(fd); + errno = EISDIR; + fd = -1; + } + } else { + close(fd); + fd = -1; + } + } + return fd; + } + void fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags) { WITH_PLATFORM_STRING(env, path, ps) { FD fd;
*** 72,91 **** /* Remove trailing slashes, since the kernel won't */ char *p = (char *)ps + strlen(ps) - 1; while ((p > ps) && (*p == '/')) *p-- = '\0'; #endif ! fd = JVM_Open(ps, flags, 0666); ! if (fd >= 0) { SET_FD(this, fd, fid); } else { throwFileNotFoundException(env, path); } } END_PLATFORM_STRING(env, ps); } - void fileClose(JNIEnv *env, jobject this, jfieldID fid) { FD fd = GET_FD(this, fid); if (fd == -1) { --- 103,121 ---- /* Remove trailing slashes, since the kernel won't */ char *p = (char *)ps + strlen(ps) - 1; while ((p > ps) && (*p == '/')) *p-- = '\0'; #endif ! fd = handleOpen(ps, flags, 0666); ! if (fd != -1) { SET_FD(this, fd, fid); } else { throwFileNotFoundException(env, path); } } END_PLATFORM_STRING(env, ps); } void fileClose(JNIEnv *env, jobject this, jfieldID fid) { FD fd = GET_FD(this, fid); if (fd == -1) {
*** 112,120 **** JNU_ThrowIOExceptionWithLastError(env, "open /dev/null failed"); } else { dup2(devnull, fd); close(devnull); } ! } else if (JVM_Close(fd) == -1) { JNU_ThrowIOExceptionWithLastError(env, "close failed"); } } --- 142,232 ---- JNU_ThrowIOExceptionWithLastError(env, "open /dev/null failed"); } else { dup2(devnull, fd); close(devnull); } ! } else if (close(fd) == -1) { JNU_ThrowIOExceptionWithLastError(env, "close failed"); } } + + ssize_t + handleRead(FD fd, void *buf, jint len) + { + ssize_t result; + RESTARTABLE(read(fd, buf, len), result); + return result; + } + + ssize_t + handleWrite(FD fd, const void *buf, jint len) + { + ssize_t result; + RESTARTABLE(write(fd, buf, len), result); + return result; + } + + jint + handleAvailable(FD fd, jlong *pbytes) + { + int mode; + struct stat64 buf64; + jlong size = -1, current = -1; + + int result; + RESTARTABLE(fstat64(fd, &buf64), result); + if (result != -1) { + mode = buf64.st_mode; + if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { + int n; + int result; + RESTARTABLE(ioctl(fd, FIONREAD, &n), result); + if (result >= 0) { + *pbytes = n; + return 1; + } + } else if (S_ISREG(mode)) { + size = buf64.st_size; + } + } + + if ((current = lseek64(fd, 0, SEEK_CUR)) == -1) { + return 0; + } + + if (size < current) { + if ((size = lseek64(fd, 0, SEEK_END)) == -1) + return 0; + else if (lseek64(fd, current, SEEK_SET) == -1) + return 0; + } + + if (size >= current) { + *pbytes = size - current; + return 1; + } else { + return 0; + } + } + + jint + handleSetLength(FD fd, jlong length) + { + int result; + RESTARTABLE(ftruncate64(fd, length), result); + return result; + } + + size_t + getLastErrorString(char *buf, size_t len) + { + if (errno == 0 || len < 1) return 0; + + const char *err = strerror(errno); + size_t n = strlen(err); + if (n >= len) + n = len - 1; + + strncpy(buf, err, n); + buf[n] = '\0'; + return n; + }