1 
2 #include "xmlvm.h"
3 #include "java_io_File.h"
4 
5 
6 //XMLVM_BEGIN_NATIVE_IMPLEMENTATION
7 #include <sys/stat.h>
8 #include <unistd.h>
9 #include <dirent.h>
10 #include "xmlvm-util.h"
11 
readlink_malloc(const char * filename)12 char * readlink_malloc (const char *filename)
13 {
14     int size = 100;
15     char *buffer = NULL;
16 
17     while (1)
18     {
19         buffer = (char *) XMLVM_ATOMIC_MALLOC (size);
20         int nchars = readlink (filename, buffer, size);
21         if (nchars < 0)
22         {
23             XMLVM_FREE(buffer);
24             return NULL;
25         }
26         if (nchars < size)
27             return buffer;
28         XMLVM_FREE(buffer);
29         size *= 2;
30     }
31 }
32 //XMLVM_END_NATIVE_IMPLEMENTATION
33 
java_io_File_oneTimeInitialization__()34 void java_io_File_oneTimeInitialization__()
35 {
36     //XMLVM_BEGIN_NATIVE[java_io_File_oneTimeInitialization__]
37     //XMLVM_END_NATIVE
38 }
39 
java_io_File_rootsImpl__()40 JAVA_OBJECT java_io_File_rootsImpl__()
41 {
42     //XMLVM_BEGIN_NATIVE[java_io_File_rootsImpl__]
43     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
44     //XMLVM_END_NATIVE
45 }
46 
java_io_File_isCaseSensitiveImpl__()47 JAVA_BOOLEAN java_io_File_isCaseSensitiveImpl__()
48 {
49     //XMLVM_BEGIN_NATIVE[java_io_File_isCaseSensitiveImpl__]
50     return 1;
51     //XMLVM_END_NATIVE
52 }
53 
java_io_File_deleteDirImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)54 JAVA_BOOLEAN java_io_File_deleteDirImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
55 {
56     //XMLVM_BEGIN_NATIVE[java_io_File_deleteDirImpl___byte_1ARRAY]
57     char* fileName = XMLVMUtil_convertFromByteArray(n1);
58     return rmdir(fileName) == 0;
59     //XMLVM_END_NATIVE
60 }
61 
java_io_File_deleteFileImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)62 JAVA_BOOLEAN java_io_File_deleteFileImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
63 {
64     //XMLVM_BEGIN_NATIVE[java_io_File_deleteFileImpl___byte_1ARRAY]
65     char* fileName = XMLVMUtil_convertFromByteArray(n1);
66     return remove(fileName) == 0;
67     //XMLVM_END_NATIVE
68 }
69 
java_io_File_existsImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)70 JAVA_BOOLEAN java_io_File_existsImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
71 {
72     //XMLVM_BEGIN_NATIVE[java_io_File_existsImpl___byte_1ARRAY]
73     char* fileName = XMLVMUtil_convertFromByteArray(n1);
74     struct stat buf;
75     int err;
76     err = stat(fileName, &buf);
77     return err != -1;
78     //XMLVM_END_NATIVE
79 }
80 
java_io_File_getCanonImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)81 JAVA_OBJECT java_io_File_getCanonImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
82 {
83     //XMLVM_BEGIN_NATIVE[java_io_File_getCanonImpl___byte_1ARRAY]
84     //See HARMONY/classlib/modules/luni/src/main/native/luni/shared/file.c
85     //They don't seem to do more either on a UNIX file system
86     return n1;
87     //XMLVM_END_NATIVE
88 }
89 
java_io_File_getTotalSpaceImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)90 JAVA_LONG java_io_File_getTotalSpaceImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
91 {
92     //XMLVM_BEGIN_NATIVE[java_io_File_getTotalSpaceImpl___byte_1ARRAY]
93     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
94     //XMLVM_END_NATIVE
95 }
96 
java_io_File_getUsableSpaceImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)97 JAVA_LONG java_io_File_getUsableSpaceImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
98 {
99     //XMLVM_BEGIN_NATIVE[java_io_File_getUsableSpaceImpl___byte_1ARRAY]
100     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
101     //XMLVM_END_NATIVE
102 }
103 
java_io_File_getFreeSpaceImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)104 JAVA_LONG java_io_File_getFreeSpaceImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
105 {
106     //XMLVM_BEGIN_NATIVE[java_io_File_getFreeSpaceImpl___byte_1ARRAY]
107     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
108     //XMLVM_END_NATIVE
109 }
110 
java_io_File_isDirectoryImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)111 JAVA_BOOLEAN java_io_File_isDirectoryImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
112 {
113     //XMLVM_BEGIN_NATIVE[java_io_File_isDirectoryImpl___byte_1ARRAY]
114     char* fileName = XMLVMUtil_convertFromByteArray(n1);
115     struct stat buf;
116     int err;
117     err = stat(fileName, &buf);
118     return buf.st_mode; // XXX & S_IFDIR;
119     //XMLVM_END_NATIVE
120 }
121 
java_io_File_isFileImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)122 JAVA_BOOLEAN java_io_File_isFileImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
123 {
124     //XMLVM_BEGIN_NATIVE[java_io_File_isFileImpl___byte_1ARRAY]
125     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
126     //XMLVM_END_NATIVE
127 }
128 
java_io_File_isHiddenImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)129 JAVA_BOOLEAN java_io_File_isHiddenImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
130 {
131     //XMLVM_BEGIN_NATIVE[java_io_File_isHiddenImpl___byte_1ARRAY]
132     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
133     //XMLVM_END_NATIVE
134 }
135 
java_io_File_isReadOnlyImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)136 JAVA_BOOLEAN java_io_File_isReadOnlyImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
137 {
138     //XMLVM_BEGIN_NATIVE[java_io_File_isReadOnlyImpl___byte_1ARRAY]
139     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
140     //XMLVM_END_NATIVE
141 }
142 
java_io_File_isWriteOnlyImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)143 JAVA_BOOLEAN java_io_File_isWriteOnlyImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
144 {
145     //XMLVM_BEGIN_NATIVE[java_io_File_isWriteOnlyImpl___byte_1ARRAY]
146     return (JAVA_BOOLEAN) 0; //TODO: Check this natively
147     //XMLVM_END_NATIVE
148 }
149 
java_io_File_getLinkImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)150 JAVA_OBJECT java_io_File_getLinkImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
151 {
152     //XMLVM_BEGIN_NATIVE[java_io_File_getLinkImpl___byte_1ARRAY]
153     const char* fileName = XMLVMUtil_convertFromByteArray(n1);
154     char* resolved = readlink_malloc(fileName);
155     if(resolved == NULL) {
156         return n1;
157     } else {
158 	XMLVMElem _r0;
159         int length = strlen(resolved);
160         _r0.o = XMLVMArray_createSingleDimension(__CLASS_byte, length);
161         char* data = (char*) ((org_xmlvm_runtime_XMLVMArray*) _r0.o)->fields.org_xmlvm_runtime_XMLVMArray.array_;
162         XMLVM_MEMCPY(data, resolved, length);
163 	return _r0.o;
164     }
165     //XMLVM_END_NATIVE
166 }
167 
java_io_File_lastModifiedImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)168 JAVA_LONG java_io_File_lastModifiedImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
169 {
170     //XMLVM_BEGIN_NATIVE[java_io_File_lastModifiedImpl___byte_1ARRAY]
171     char* fileName = XMLVMUtil_convertFromByteArray(n1);
172     struct stat buf;
173     int err;
174     err = stat(fileName, &buf);
175     return buf.st_mtime;
176     //XMLVM_END_NATIVE
177 }
178 
java_io_File_setLastModifiedImpl___byte_1ARRAY_long(JAVA_OBJECT me,JAVA_OBJECT n1,JAVA_LONG n2)179 JAVA_BOOLEAN java_io_File_setLastModifiedImpl___byte_1ARRAY_long(JAVA_OBJECT me, JAVA_OBJECT n1, JAVA_LONG n2)
180 {
181     //XMLVM_BEGIN_NATIVE[java_io_File_setLastModifiedImpl___byte_1ARRAY_long]
182     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
183     //XMLVM_END_NATIVE
184 }
185 
java_io_File_setReadOnlyImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)186 JAVA_BOOLEAN java_io_File_setReadOnlyImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
187 {
188     //XMLVM_BEGIN_NATIVE[java_io_File_setReadOnlyImpl___byte_1ARRAY]
189     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
190     //XMLVM_END_NATIVE
191 }
192 
java_io_File_setReadableImpl___byte_1ARRAY_boolean_boolean(JAVA_OBJECT me,JAVA_OBJECT n1,JAVA_BOOLEAN n2,JAVA_BOOLEAN n3)193 JAVA_BOOLEAN java_io_File_setReadableImpl___byte_1ARRAY_boolean_boolean(JAVA_OBJECT me, JAVA_OBJECT n1, JAVA_BOOLEAN n2, JAVA_BOOLEAN n3)
194 {
195     //XMLVM_BEGIN_NATIVE[java_io_File_setReadableImpl___byte_1ARRAY_boolean_boolean]
196     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
197     //XMLVM_END_NATIVE
198 }
199 
java_io_File_setWritableImpl___byte_1ARRAY_boolean_boolean(JAVA_OBJECT me,JAVA_OBJECT n1,JAVA_BOOLEAN n2,JAVA_BOOLEAN n3)200 JAVA_BOOLEAN java_io_File_setWritableImpl___byte_1ARRAY_boolean_boolean(JAVA_OBJECT me, JAVA_OBJECT n1, JAVA_BOOLEAN n2, JAVA_BOOLEAN n3)
201 {
202     //XMLVM_BEGIN_NATIVE[java_io_File_setWritableImpl___byte_1ARRAY_boolean_boolean]
203     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
204     //XMLVM_END_NATIVE
205 }
206 
java_io_File_lengthImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)207 JAVA_LONG java_io_File_lengthImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
208 {
209     //XMLVM_BEGIN_NATIVE[java_io_File_lengthImpl___byte_1ARRAY]
210     char* fileName = XMLVMUtil_convertFromByteArray(n1);
211     FILE* fp = fopen(fileName, "rb");
212     fseek(fp, 0L, SEEK_END);
213     JAVA_LONG size = ftell(fp);
214     fclose(fp);
215     return size;
216     //XMLVM_END_NATIVE
217 }
218 
java_io_File_listImpl___byte_1ARRAY(JAVA_OBJECT n1)219 JAVA_OBJECT java_io_File_listImpl___byte_1ARRAY(JAVA_OBJECT n1)
220 {
221     //XMLVM_BEGIN_NATIVE[java_io_File_listImpl___byte_1ARRAY]
222 	     // TODO: There may be memory management issues in this implementation
223 	     org_xmlvm_runtime_XMLVMArray *array =
224 	         (org_xmlvm_runtime_XMLVMArray *) __NEW_org_xmlvm_runtime_XMLVMArray();
225 	     array->fields.org_xmlvm_runtime_XMLVMArray.type_   =  __CLASS_org_xmlvm_runtime_XMLVMArray;
226 	     array->fields.org_xmlvm_runtime_XMLVMArray.length_ =  256;
227 	     array->fields.org_xmlvm_runtime_XMLVMArray.array_  = XMLVM_MALLOC(sizeof(JAVA_OBJECT) * 256);
228 
229 	     JAVA_OBJECT *subarray = (JAVA_OBJECT *) array->fields.org_xmlvm_runtime_XMLVMArray.array_;
230 
231 	     int i = 0;
232 	     for (i = 0; i < 256; i++) {
233 	         org_xmlvm_runtime_XMLVMArray *array2 =
234 	            (org_xmlvm_runtime_XMLVMArray *) __NEW_org_xmlvm_runtime_XMLVMArray();
235 	         array2->fields.org_xmlvm_runtime_XMLVMArray.type_   = __CLASS_byte;
236 	         array2->fields.org_xmlvm_runtime_XMLVMArray.length_ = 256;
237 	         array2->fields.org_xmlvm_runtime_XMLVMArray.array_  = XMLVM_MALLOC(sizeof(char) * 256);
238 	         subarray[i] = (JAVA_OBJECT) array2;
239 	     }
240 
241 	     // Get the
242 	     char* fileName = XMLVMUtil_convertFromByteArray(n1);
243 
244 	     DIR *d;
245 	     struct dirent *e;
246 	     if (d = opendir(fileName)) {
247 	         i = 0;
248 	         int j = 0;
249 	         while (e = readdir(d)) {
250 	             if (i < 256) { // TODO: What if there are more than 256 files?
251 	                 org_xmlvm_runtime_XMLVMArray *array2 = (org_xmlvm_runtime_XMLVMArray *) (subarray[i]);
252 	                 char *bytearray = array2->fields.org_xmlvm_runtime_XMLVMArray.array_;
253 	                 for (j = 0; j < 256; j++) {
254 	                     bytearray[j] = e->d_name[j];
255 	                     if (e->d_name[j] == 0) {
256 	                         array2->fields.org_xmlvm_runtime_XMLVMArray.length_ = j;
257 	                         break;
258 	                     }
259 	                 }
260 	                 i++;
261 
262 	             }
263 
264 	             // Add e->d_name to array!
265 	         }
266 	         array->fields.org_xmlvm_runtime_XMLVMArray.length_ =  i;
267 	         closedir(d);
268 	     } else {
269 	         // TODO: Throw IOException?
270 	     }
271 	     return array;
272     //XMLVM_END_NATIVE
273 }
274 
java_io_File_mkdirImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)275 JAVA_BOOLEAN java_io_File_mkdirImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
276 {
277     //XMLVM_BEGIN_NATIVE[java_io_File_mkdirImpl___byte_1ARRAY]
278     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
279     //XMLVM_END_NATIVE
280 }
281 
java_io_File_newFileImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)282 JAVA_INT java_io_File_newFileImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
283 {
284     //XMLVM_BEGIN_NATIVE[java_io_File_newFileImpl___byte_1ARRAY]
285     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
286     //XMLVM_END_NATIVE
287 }
288 
java_io_File_renameToImpl___byte_1ARRAY_byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1,JAVA_OBJECT n2)289 JAVA_BOOLEAN java_io_File_renameToImpl___byte_1ARRAY_byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1, JAVA_OBJECT n2)
290 {
291     //XMLVM_BEGIN_NATIVE[java_io_File_renameToImpl___byte_1ARRAY_byte_1ARRAY]
292     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
293     //XMLVM_END_NATIVE
294 }
295 
java_io_File_setExecutableImpl___byte_1ARRAY_boolean_boolean(JAVA_OBJECT me,JAVA_OBJECT n1,JAVA_BOOLEAN n2,JAVA_BOOLEAN n3)296 JAVA_BOOLEAN java_io_File_setExecutableImpl___byte_1ARRAY_boolean_boolean(JAVA_OBJECT me, JAVA_OBJECT n1, JAVA_BOOLEAN n2, JAVA_BOOLEAN n3)
297 {
298     //XMLVM_BEGIN_NATIVE[java_io_File_setExecutableImpl___byte_1ARRAY_boolean_boolean]
299     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
300     //XMLVM_END_NATIVE
301 }
302 
java_io_File_isExecutableImpl___byte_1ARRAY(JAVA_OBJECT me,JAVA_OBJECT n1)303 JAVA_BOOLEAN java_io_File_isExecutableImpl___byte_1ARRAY(JAVA_OBJECT me, JAVA_OBJECT n1)
304 {
305     //XMLVM_BEGIN_NATIVE[java_io_File_isExecutableImpl___byte_1ARRAY]
306     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
307     //XMLVM_END_NATIVE
308 }
309 
310