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;
+}