103 }
104 return ((jlong) fd[0] << 32) | (jlong) fd[1];
105 }
106
107 JNIEXPORT jint JNICALL
108 Java_sun_nio_ch_IOUtil_write1(JNIEnv *env, jclass cl, jint fd, jbyte b)
109 {
110 char c = (char)b;
111 return convertReturnVal(env, write(fd, &c, 1), JNI_FALSE);
112 }
113
114 JNIEXPORT jboolean JNICALL
115 Java_sun_nio_ch_IOUtil_drain(JNIEnv *env, jclass cl, jint fd)
116 {
117 char buf[16];
118 int tn = 0;
119
120 for (;;) {
121 int n = read(fd, buf, sizeof(buf));
122 tn += n;
123 if ((n < 0) && (errno != EAGAIN))
124 JNU_ThrowIOExceptionWithLastError(env, "Drain");
125 if (n == (int)sizeof(buf))
126 continue;
127 return (tn > 0) ? JNI_TRUE : JNI_FALSE;
128 }
129 }
130
131 JNIEXPORT jint JNICALL
132 Java_sun_nio_ch_IOUtil_drain1(JNIEnv *env, jclass cl, jint fd)
133 {
134 int res;
135 char buf[1];
136
137 res = read(fd, buf, 1);
138 if (res < 0) {
139 if (errno == EAGAIN) {
140 res = 0;
141 } else if (errno == EINTR) {
142 return IOS_INTERRUPTED;
143 } else {
144 JNU_ThrowIOExceptionWithLastError(env, "read");
145 return IOS_THROWN;
146 }
147 }
148 return res;
149 }
150
151 JNIEXPORT jint JNICALL
152 Java_sun_nio_ch_IOUtil_fdLimit(JNIEnv *env, jclass this)
153 {
154 struct rlimit rlp;
155 if (getrlimit(RLIMIT_NOFILE, &rlp) < 0) {
156 JNU_ThrowIOExceptionWithLastError(env, "getrlimit failed");
157 return -1;
158 }
159 if (rlp.rlim_max == RLIM_INFINITY ||
170 jlong iov_max = sysconf(_SC_IOV_MAX);
171 if (iov_max == -1)
172 iov_max = 16;
173 return (jint)iov_max;
174 }
175
176 /* Declared in nio_util.h for use elsewhere in NIO */
177
178 jint
179 convertReturnVal(JNIEnv *env, jint n, jboolean reading)
180 {
181 if (n > 0) /* Number of bytes written */
182 return n;
183 else if (n == 0) {
184 if (reading) {
185 return IOS_EOF; /* EOF is -1 in javaland */
186 } else {
187 return 0;
188 }
189 }
190 else if (errno == EAGAIN)
191 return IOS_UNAVAILABLE;
192 else if (errno == EINTR)
193 return IOS_INTERRUPTED;
194 else {
195 const char *msg = reading ? "Read failed" : "Write failed";
196 JNU_ThrowIOExceptionWithLastError(env, msg);
197 return IOS_THROWN;
198 }
199 }
200
201 /* Declared in nio_util.h for use elsewhere in NIO */
202
203 jlong
204 convertLongReturnVal(JNIEnv *env, jlong n, jboolean reading)
205 {
206 if (n > 0) /* Number of bytes written */
207 return n;
208 else if (n == 0) {
209 if (reading) {
210 return IOS_EOF; /* EOF is -1 in javaland */
211 } else {
212 return 0;
213 }
214 }
215 else if (errno == EAGAIN)
216 return IOS_UNAVAILABLE;
217 else if (errno == EINTR)
218 return IOS_INTERRUPTED;
219 else {
220 const char *msg = reading ? "Read failed" : "Write failed";
221 JNU_ThrowIOExceptionWithLastError(env, msg);
222 return IOS_THROWN;
223 }
224 }
225
226 jint
227 fdval(JNIEnv *env, jobject fdo)
228 {
229 return (*env)->GetIntField(env, fdo, fd_fdID);
230 }
|
103 }
104 return ((jlong) fd[0] << 32) | (jlong) fd[1];
105 }
106
107 JNIEXPORT jint JNICALL
108 Java_sun_nio_ch_IOUtil_write1(JNIEnv *env, jclass cl, jint fd, jbyte b)
109 {
110 char c = (char)b;
111 return convertReturnVal(env, write(fd, &c, 1), JNI_FALSE);
112 }
113
114 JNIEXPORT jboolean JNICALL
115 Java_sun_nio_ch_IOUtil_drain(JNIEnv *env, jclass cl, jint fd)
116 {
117 char buf[16];
118 int tn = 0;
119
120 for (;;) {
121 int n = read(fd, buf, sizeof(buf));
122 tn += n;
123 if ((n < 0) && (errno != EAGAIN && errno != EWOULDBLOCK))
124 JNU_ThrowIOExceptionWithLastError(env, "Drain");
125 if (n == (int)sizeof(buf))
126 continue;
127 return (tn > 0) ? JNI_TRUE : JNI_FALSE;
128 }
129 }
130
131 JNIEXPORT jint JNICALL
132 Java_sun_nio_ch_IOUtil_drain1(JNIEnv *env, jclass cl, jint fd)
133 {
134 int res;
135 char buf[1];
136
137 res = read(fd, buf, 1);
138 if (res < 0) {
139 if (errno == EAGAIN || errno == EWOULDBLOCK) {
140 res = 0;
141 } else if (errno == EINTR) {
142 return IOS_INTERRUPTED;
143 } else {
144 JNU_ThrowIOExceptionWithLastError(env, "read");
145 return IOS_THROWN;
146 }
147 }
148 return res;
149 }
150
151 JNIEXPORT jint JNICALL
152 Java_sun_nio_ch_IOUtil_fdLimit(JNIEnv *env, jclass this)
153 {
154 struct rlimit rlp;
155 if (getrlimit(RLIMIT_NOFILE, &rlp) < 0) {
156 JNU_ThrowIOExceptionWithLastError(env, "getrlimit failed");
157 return -1;
158 }
159 if (rlp.rlim_max == RLIM_INFINITY ||
170 jlong iov_max = sysconf(_SC_IOV_MAX);
171 if (iov_max == -1)
172 iov_max = 16;
173 return (jint)iov_max;
174 }
175
176 /* Declared in nio_util.h for use elsewhere in NIO */
177
178 jint
179 convertReturnVal(JNIEnv *env, jint n, jboolean reading)
180 {
181 if (n > 0) /* Number of bytes written */
182 return n;
183 else if (n == 0) {
184 if (reading) {
185 return IOS_EOF; /* EOF is -1 in javaland */
186 } else {
187 return 0;
188 }
189 }
190 else if (errno == EAGAIN || errno == EWOULDBLOCK)
191 return IOS_UNAVAILABLE;
192 else if (errno == EINTR)
193 return IOS_INTERRUPTED;
194 else {
195 const char *msg = reading ? "Read failed" : "Write failed";
196 JNU_ThrowIOExceptionWithLastError(env, msg);
197 return IOS_THROWN;
198 }
199 }
200
201 /* Declared in nio_util.h for use elsewhere in NIO */
202
203 jlong
204 convertLongReturnVal(JNIEnv *env, jlong n, jboolean reading)
205 {
206 if (n > 0) /* Number of bytes written */
207 return n;
208 else if (n == 0) {
209 if (reading) {
210 return IOS_EOF; /* EOF is -1 in javaland */
211 } else {
212 return 0;
213 }
214 }
215 else if (errno == EAGAIN || errno == EWOULDBLOCK)
216 return IOS_UNAVAILABLE;
217 else if (errno == EINTR)
218 return IOS_INTERRUPTED;
219 else {
220 const char *msg = reading ? "Read failed" : "Write failed";
221 JNU_ThrowIOExceptionWithLastError(env, msg);
222 return IOS_THROWN;
223 }
224 }
225
226 jint
227 fdval(JNIEnv *env, jobject fdo)
228 {
229 return (*env)->GetIntField(env, fdo, fd_fdID);
230 }
|