forked from jnr/jnr-posix
-
Notifications
You must be signed in to change notification settings - Fork 0
/
JavaPOSIX.java
273 lines (214 loc) · 7.01 KB
/
JavaPOSIX.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
package org.jruby.ext.posix;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import org.jruby.ext.posix.util.Platform;
public class JavaPOSIX implements POSIX {
POSIXHandler handler;
JavaLibCHelper helper;
public JavaPOSIX(POSIXHandler handler) {
this.handler = handler;
helper = new JavaLibCHelper(handler);
}
public FileStat allocateStat() {
return new JavaFileStat(this, handler);
}
public int chmod(String filename, int mode) {
return helper.chmod(filename, mode);
}
public int chown(String filename, int user, int group) {
return helper.chown(filename, user, group);
}
public FileStat fstat(FileDescriptor descriptor) {
handler.unimplementedError("fstat unimplemented");
return null;
}
public int getegid() {
return GIDHolder.GID;
}
public int geteuid() {
return UIDHolder.UID;
}
public int getgid() {
return GIDHolder.GID;
}
public String getlogin() {
return helper.getlogin();
}
public int getpgid() {
return unimplementedInt("getpgid");
}
public int getpgrp() {
return unimplementedInt("getpgrp");
}
public int getpid() {
return helper.getpid();
}
public int getppid() {
return unimplementedInt("getppid");
}
public Passwd getpwent() {
return helper.getpwent();
}
public Passwd getpwuid(int which) {
handler.unimplementedError("getpwuid unimplemented");
return null;
}
public Group getgrgid(int which) {
handler.unimplementedError("getgrgid unimplemented");
return null;
}
public Passwd getpwnam(String which) {
handler.unimplementedError("getpwnam unimplemented");
return null;
}
public Group getgrnam(String which) {
handler.unimplementedError("getgrnam unimplemented");
return null;
}
public Group getgrent() {
handler.unimplementedError("getgrent unimplemented");
return null;
}
public int setpwent() {
return helper.setpwent();
}
public int endpwent() {
return helper.endpwent();
}
public int setgrent() {
return unimplementedInt("setgrent");
}
public int endgrent() {
return unimplementedInt("endgrent");
}
public int getuid() {
return UIDHolder.UID;
}
public int fork() {
return -1;
}
public boolean isatty(FileDescriptor fd) {
return (fd == FileDescriptor.in
|| fd == FileDescriptor.out
|| fd == FileDescriptor.err);
}
public int kill(int pid, int signal) {
return unimplementedInt("kill"); // FIXME: Can be implemented
}
public int lchmod(String filename, int mode) {
return unimplementedInt("lchmod"); // FIXME: Can be implemented
}
public int lchown(String filename, int user, int group) {
return unimplementedInt("lchown"); // FIXME: Can be implemented
}
public int link(String oldpath, String newpath) {
return helper.link(oldpath, newpath);
}
public FileStat lstat(String path) {
FileStat stat = allocateStat();
if (helper.lstat(path, stat) < 0) handler.error(ERRORS.ENOENT, path);
return stat;
}
public int mkdir(String path, int mode) {
return helper.mkdir(path, mode);
}
public String readlink(String path) throws IOException {
// TODO: this should not be hardcoded to 256 bytes
ByteBuffer buffer = ByteBuffer.allocateDirect(256);
int result = helper.readlink(path, buffer, buffer.capacity());
if (result == -1) return null;
buffer.position(0);
buffer.limit(result);
return Charset.forName("ASCII").decode(buffer).toString();
}
public FileStat stat(String path) {
FileStat stat = allocateStat();
if (helper.stat(path, stat) < 0) handler.error(ERRORS.ENOENT, path);
return stat;
}
public int symlink(String oldpath, String newpath) {
return helper.symlink(oldpath, newpath);
}
public int setegid(int egid) {
return unimplementedInt("setegid");
}
public int seteuid(int euid) {
return unimplementedInt("seteuid");
}
public int setgid(int gid) {
return unimplementedInt("setgid");
}
public int getpgid(int pid) {
return unimplementedInt("getpgid");
}
public int setpgid(int pid, int pgid) {
return unimplementedInt("setpgid");
}
public int setpgrp(int pid, int pgrp) {
return unimplementedInt("setpgrp");
}
public int setsid() {
return unimplementedInt("setsid");
}
public int setuid(int uid) {
return unimplementedInt("setuid");
}
public int umask(int mask) {
// TODO: We can possibly maintain an internal mask and try and apply it to individual
// libc methods.
return 0;
}
public int utimes(String path, long[] atimeval, long[] mtimeval) {
long mtimeMillis;
if (mtimeval != null) {
assert mtimeval.length == 2;
mtimeMillis = (mtimeval[0] * 1000) + (mtimeval[1] / 1000);
} else {
mtimeMillis = System.currentTimeMillis();
}
new File(path).setLastModified(mtimeMillis);
return 0;
}
public int wait(int[] status) {
return unimplementedInt("wait");
}
public int waitpid(int pid, int[] status, int flags) {
return unimplementedInt("waitpid");
}
public int getpriority(int which, int who) {
return unimplementedInt("getpriority");
}
public int setpriority(int which, int who, int prio) {
return unimplementedInt("setpriority");
}
private int unimplementedInt(String message) {
handler.unimplementedError(message);
return -1;
}
private static final class UIDHolder {
public static final int UID = IDHelper.getID("-u");
}
private static final class GIDHolder {
public static final int GID = IDHelper.getID("-g");
}
private static final class IDHelper {
private static final String ID_CMD = Platform.IS_SOLARIS ? "/usr/xpg4/bin/id" : "/usr/bin/id";
private static final int NOBODY = Platform.IS_WINDOWS ? 0 : Short.MAX_VALUE;
public static int getID(String option) {
try {
Process p = Runtime.getRuntime().exec(new String[] { ID_CMD, option });
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
return Integer.parseInt(r.readLine());
} catch (IOException ex) {
return NOBODY;
} catch (NumberFormatException ex) {
return NOBODY;
}
}
}
}