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