You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/04/27 09:11:42 UTC
svn commit: r768877 -
/commons/sandbox/runtime/trunk/src/main/native/os/unix/file.c
Author: mturk
Date: Mon Apr 27 07:11:42 2009
New Revision: 768877
URL: http://svn.apache.org/viewvc?rev=768877&view=rev
Log:
Add posix fprot
Modified:
commons/sandbox/runtime/trunk/src/main/native/os/unix/file.c
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/file.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/file.c?rev=768877&r1=768876&r2=768877&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/file.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/file.c Mon Apr 27 07:11:42 2009
@@ -198,3 +198,105 @@
return rv;
}
+
+/* APR's apr_unix_* private functions */
+mode_t ACR_UnixPermsToMode(int perms)
+{
+ mode_t mode = 0;
+
+ if (perms & ACR_FPROT_USETID)
+ mode |= S_ISUID;
+ if (perms & ACR_FPROT_UREAD)
+ mode |= S_IRUSR;
+ if (perms & ACR_FPROT_UWRITE)
+ mode |= S_IWUSR;
+ if (perms & ACR_FPROT_UEXECUTE)
+ mode |= S_IXUSR;
+
+ if (perms & ACR_FPROT_GSETID)
+ mode |= S_ISGID;
+ if (perms & ACR_FPROT_GREAD)
+ mode |= S_IRGRP;
+ if (perms & ACR_FPROT_GWRITE)
+ mode |= S_IWGRP;
+ if (perms & ACR_FPROT_GEXECUTE)
+ mode |= S_IXGRP;
+
+#ifdef S_ISVTX
+ if (perms & ACR_FPROT_WSTICKY)
+ mode |= S_ISVTX;
+#endif
+ if (perms & ACR_FPROT_WREAD)
+ mode |= S_IROTH;
+ if (perms & ACR_FPROT_WWRITE)
+ mode |= S_IWOTH;
+ if (perms & ACR_FPROT_WEXECUTE)
+ mode |= S_IXOTH;
+
+ return mode;
+}
+
+int ACR_UnixModeToPerms(mode_t mode)
+{
+ int perms = 0;
+
+ if (mode & S_ISUID)
+ perms |= ACR_FPROT_USETID;
+ if (mode & S_IRUSR)
+ perms |= ACR_FPROT_UREAD;
+ if (mode & S_IWUSR)
+ perms |= ACR_FPROT_UWRITE;
+ if (mode & S_IXUSR)
+ perms |= ACR_FPROT_UEXECUTE;
+
+ if (mode & S_ISGID)
+ perms |= ACR_FPROT_GSETID;
+ if (mode & S_IRGRP)
+ perms |= ACR_FPROT_GREAD;
+ if (mode & S_IWGRP)
+ perms |= ACR_FPROT_GWRITE;
+ if (mode & S_IXGRP)
+ perms |= ACR_FPROT_GEXECUTE;
+
+#ifdef S_ISVTX
+ if (mode & S_ISVTX)
+ perms |= ACR_FPROT_WSTICKY;
+#endif
+ if (mode & S_IROTH)
+ perms |= ACR_FPROT_WREAD;
+ if (mode & S_IWOTH)
+ perms |= ACR_FPROT_WWRITE;
+ if (mode & S_IXOTH)
+ perms |= ACR_FPROT_WEXECUTE;
+
+ return perms;
+}
+
+ACR_DECLARE(int) ACR_FileProtectionGet(JNIEnv *_E, const char *fname)
+{
+ struct_stat info;
+
+ /* Always use a real target */
+ if (stat(fname, &info) == 0) {
+ return ACR_UnixModeToPerms(info.st_mode);
+ }
+ else if (_E) {
+ if (errno == EACCES)
+ ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+ else
+ ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, errno);
+ }
+ return -1;
+}
+
+ACR_JNI_EXPORT_DECLARE(int, io_File, fprot0)(ACR_JNISTDARGS, jstring pathname)
+{
+ int prot = 0;
+
+ UNREFERENCED_O;
+ WITH_CSTR(pathname) {
+ prot = ACR_FileProtectionGet(_E, J2S(pathname));
+ } END_WITH_CSTR(pathname);
+
+ return prot;
+}