Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/nio/fs/SolarisNativeDispatcher.c
32288 views
1
/*
2
* Copyright (c) 2008, 2012, 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
23
* questions.
24
*/
25
26
#include "jni.h"
27
#include "jni_util.h"
28
#include "jvm.h"
29
#include "jlong.h"
30
31
#include <strings.h>
32
#include <errno.h>
33
#include <sys/acl.h>
34
#include <sys/mnttab.h>
35
#include <sys/mkdev.h>
36
37
#include "jni.h"
38
39
#include "sun_nio_fs_SolarisNativeDispatcher.h"
40
41
static jfieldID entry_name;
42
static jfieldID entry_dir;
43
static jfieldID entry_fstype;
44
static jfieldID entry_options;
45
static jfieldID entry_dev;
46
47
static void throwUnixException(JNIEnv* env, int errnum) {
48
jobject x = JNU_NewObjectByName(env, "sun/nio/fs/UnixException",
49
"(I)V", errnum);
50
if (x != NULL) {
51
(*env)->Throw(env, x);
52
}
53
}
54
55
JNIEXPORT void JNICALL
56
Java_sun_nio_fs_SolarisNativeDispatcher_init(JNIEnv *env, jclass clazz) {
57
clazz = (*env)->FindClass(env, "sun/nio/fs/UnixMountEntry");
58
CHECK_NULL(clazz);
59
entry_name = (*env)->GetFieldID(env, clazz, "name", "[B");
60
CHECK_NULL(entry_name);
61
entry_dir = (*env)->GetFieldID(env, clazz, "dir", "[B");
62
CHECK_NULL(entry_dir);
63
entry_fstype = (*env)->GetFieldID(env, clazz, "fstype", "[B");
64
CHECK_NULL(entry_fstype);
65
entry_options = (*env)->GetFieldID(env, clazz, "opts", "[B");
66
CHECK_NULL(entry_options);
67
entry_dev = (*env)->GetFieldID(env, clazz, "dev", "J");
68
CHECK_NULL(entry_dev);
69
}
70
71
JNIEXPORT jint JNICALL
72
Java_sun_nio_fs_SolarisNativeDispatcher_facl(JNIEnv* env, jclass this, jint fd,
73
jint cmd, jint nentries, jlong address)
74
{
75
void* aclbufp = jlong_to_ptr(address);
76
int n = -1;
77
78
n = facl((int)fd, (int)cmd, (int)nentries, aclbufp);
79
if (n == -1) {
80
throwUnixException(env, errno);
81
}
82
return (jint)n;
83
}
84
85
JNIEXPORT jint JNICALL
86
Java_sun_nio_fs_SolarisNativeDispatcher_getextmntent(JNIEnv* env, jclass this,
87
jlong value, jobject entry)
88
{
89
struct extmnttab ent;
90
FILE* fp = jlong_to_ptr(value);
91
jsize len;
92
jbyteArray bytes;
93
char* name;
94
char* dir;
95
char* fstype;
96
char* options;
97
dev_t dev;
98
99
if (getextmntent(fp, &ent, 0))
100
return -1;
101
name = ent.mnt_special;
102
dir = ent.mnt_mountp;
103
fstype = ent.mnt_fstype;
104
options = ent.mnt_mntopts;
105
dev = makedev(ent.mnt_major, ent.mnt_minor);
106
if (dev == NODEV) {
107
throwUnixException(env, errno);
108
return -1;
109
}
110
111
len = strlen(name);
112
bytes = (*env)->NewByteArray(env, len);
113
if (bytes == NULL)
114
return -1;
115
(*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)name);
116
(*env)->SetObjectField(env, entry, entry_name, bytes);
117
118
len = strlen(dir);
119
bytes = (*env)->NewByteArray(env, len);
120
if (bytes == NULL)
121
return -1;
122
(*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)dir);
123
(*env)->SetObjectField(env, entry, entry_dir, bytes);
124
125
len = strlen(fstype);
126
bytes = (*env)->NewByteArray(env, len);
127
if (bytes == NULL)
128
return -1;
129
(*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)fstype);
130
(*env)->SetObjectField(env, entry, entry_fstype, bytes);
131
132
len = strlen(options);
133
bytes = (*env)->NewByteArray(env, len);
134
if (bytes == NULL)
135
return -1;
136
(*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)options);
137
(*env)->SetObjectField(env, entry, entry_options, bytes);
138
139
if (dev != 0)
140
(*env)->SetLongField(env, entry, entry_dev, (jlong)dev);
141
142
return 0;
143
}
144
145