Lines 1-5
Link Here
|
1 |
/******************************************************************************* |
1 |
/******************************************************************************* |
2 |
* Copyright (c) 2000, 2007 IBM Corporation and others. |
2 |
* Copyright (c) 2000, 2009 IBM Corporation and others. |
3 |
* All rights reserved. This program and the accompanying materials |
3 |
* All rights reserved. This program and the accompanying materials |
4 |
* are made available under the terms of the Eclipse Public License v1.0 |
4 |
* are made available under the terms of the Eclipse Public License v1.0 |
5 |
* which accompanies this distribution, and is available at |
5 |
* which accompanies this distribution, and is available at |
Lines 68-74
Link Here
|
68 |
JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_filesystem_local_LocalFileNatives_nativeAttributes |
68 |
JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_filesystem_local_LocalFileNatives_nativeAttributes |
69 |
(JNIEnv *env, jclass clazz) { |
69 |
(JNIEnv *env, jclass clazz) { |
70 |
#if defined(EFS_SYMLINK_SUPPORT) |
70 |
#if defined(EFS_SYMLINK_SUPPORT) |
71 |
return ATTRIBUTE_READ_ONLY | ATTRIBUTE_EXECUTABLE | ATTRIBUTE_SYMLINK | ATTRIBUTE_LINK_TARGET; |
71 |
return ATTRIBUTE_READ_ONLY | ATTRIBUTE_EXECUTABLE | ATTRIBUTE_SYMLINK | ATTRIBUTE_LINK_TARGET | ATTRIBUTE_ACCESSIBLE; |
72 |
#else |
72 |
#else |
73 |
return ATTRIBUTE_READ_ONLY | ATTRIBUTE_EXECUTABLE; |
73 |
return ATTRIBUTE_READ_ONLY | ATTRIBUTE_EXECUTABLE; |
74 |
#endif |
74 |
#endif |
Lines 101-107
Link Here
|
101 |
mid = (*env)->GetMethodID(env, cls, "setExists", "(Z)V"); |
101 |
mid = (*env)->GetMethodID(env, cls, "setExists", "(Z)V"); |
102 |
if (mid == 0) return JNI_FALSE; |
102 |
if (mid == 0) return JNI_FALSE; |
103 |
(*env)->CallVoidMethod(env, fileInfo, mid, JNI_TRUE); |
103 |
(*env)->CallVoidMethod(env, fileInfo, mid, JNI_TRUE); |
104 |
|
104 |
|
|
|
105 |
// set accessible attribute |
106 |
mid = (*env)->GetMethodID(env, cls, "setAttribute", "(IZ)V"); |
107 |
if (mid == 0) return JNI_FALSE; |
108 |
(*env)->CallVoidMethod(env, fileInfo, mid, ATTRIBUTE_ACCESSIBLE, JNI_TRUE); |
109 |
|
105 |
// last modified |
110 |
// last modified |
106 |
mid = (*env)->GetMethodID(env, cls, "setLastModified", "(J)V"); |
111 |
mid = (*env)->GetMethodID(env, cls, "setLastModified", "(J)V"); |
107 |
if (mid == 0) return JNI_FALSE; |
112 |
if (mid == 0) return JNI_FALSE; |
Lines 156-161
Link Here
|
156 |
mid = (*env)->GetMethodID(env, cls, "setStringAttribute", "(ILjava/lang/String;)V"); |
161 |
mid = (*env)->GetMethodID(env, cls, "setStringAttribute", "(ILjava/lang/String;)V"); |
157 |
if (mid == 0) return JNI_FALSE; |
162 |
if (mid == 0) return JNI_FALSE; |
158 |
(*env)->CallVoidMethod(env, fileInfo, mid, ATTRIBUTE_LINK_TARGET, linkTarget); |
163 |
(*env)->CallVoidMethod(env, fileInfo, mid, ATTRIBUTE_LINK_TARGET, linkTarget); |
|
|
164 |
|
165 |
return JNI_TRUE; |
166 |
} |
167 |
|
168 |
/* |
169 |
* Set exists and non accessible in IFileInfo |
170 |
*/ |
171 |
jboolean setExistsNonAccessibleInFileInfo (JNIEnv *env, jobject fileInfo) { |
172 |
jclass cls; |
173 |
jmethodID mid; |
174 |
|
175 |
cls = (*env)->GetObjectClass(env, fileInfo); |
176 |
if (cls == 0) return JNI_FALSE; |
177 |
|
178 |
// exists |
179 |
mid = (*env)->GetMethodID(env, cls, "setExists", "(Z)V"); |
180 |
if (mid == 0) return JNI_FALSE; |
181 |
(*env)->CallVoidMethod(env, fileInfo, mid, JNI_TRUE); |
182 |
|
183 |
// set accessible attribute to false |
184 |
mid = (*env)->GetMethodID(env, cls, "setAttribute", "(IZ)V"); |
185 |
if (mid == 0) return JNI_FALSE; |
186 |
(*env)->CallVoidMethod(env, fileInfo, mid, ATTRIBUTE_ACCESSIBLE, JNI_FALSE); |
187 |
|
188 |
return JNI_TRUE; |
159 |
} |
189 |
} |
160 |
#endif |
190 |
#endif |
161 |
|
191 |
|
Lines 175-184
Link Here
|
175 |
/* get stat */ |
205 |
/* get stat */ |
176 |
name = getByteArray(env, target); |
206 |
name = getByteArray(env, target); |
177 |
#if defined(EFS_SYMLINK_SUPPORT) |
207 |
#if defined(EFS_SYMLINK_SUPPORT) |
178 |
//do an lstat first to see if it is a symbolic link |
208 |
// do an lstat first to see if it is a symbolic link |
179 |
code = lstat((const char*)name, &info); |
209 |
code = lstat((const char*)name, &info); |
180 |
if (code == 0 && (info.st_mode & S_IFLNK) == S_IFLNK) { |
210 |
if (code == 0 && (info.st_mode & S_IFLNK) == S_IFLNK) { |
181 |
//symbolic link: read link target |
211 |
// symbolic link: read link target |
182 |
char buf[PATH_MAX+1]; |
212 |
char buf[PATH_MAX+1]; |
183 |
int len; |
213 |
int len; |
184 |
jbyteArray barr; |
214 |
jbyteArray barr; |
Lines 192-206
Link Here
|
192 |
linkTarget = getString(env, barr); |
222 |
linkTarget = getString(env, barr); |
193 |
setSymlinkInFileInfo(env, fileInfo, linkTarget); |
223 |
setSymlinkInFileInfo(env, fileInfo, linkTarget); |
194 |
|
224 |
|
195 |
//stat link target (will fail for broken links) |
225 |
// stat link target |
196 |
code = stat((const char*)name, &info); |
226 |
code = stat((const char*)name, &info); |
|
|
227 |
|
228 |
// link is broken |
229 |
if (code == -1) { |
230 |
return setExistsNonAccessibleInFileInfo(env, fileInfo); |
231 |
} |
197 |
} |
232 |
} |
198 |
#else |
233 |
#else |
199 |
code = stat((const char*)name, &info); |
234 |
code = stat((const char*)name, &info); |
200 |
#endif |
235 |
#endif |
201 |
free(name); |
236 |
free(name); |
202 |
|
237 |
|
203 |
/* test if an error occurred */ |
238 |
// test if an error occurred |
204 |
if (code == -1) |
239 |
if (code == -1) |
205 |
return 0; |
240 |
return 0; |
206 |
return convertStatToFileInfo(env, info, fileInfo); |
241 |
return convertStatToFileInfo(env, info, fileInfo); |