Author: mattf Date: Tue Jul 19 23:01:45 2011 New Revision: 1148579 URL: http://svn.apache.org/viewvc?rev=1148579&view=rev Log: HADOOP-7432. Back-port HADOOP-7110 to 0.20-security: Implement chmod in NativeIO library. Contributed by Sherry Chen. Modified: hadoop/common/branches/branch-0.20-security/CHANGES.txt hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java hadoop/common/branches/branch-0.20-security/src/native/config.h.in hadoop/common/branches/branch-0.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c hadoop/common/branches/branch-0.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java Modified: hadoop/common/branches/branch-0.20-security/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/CHANGES.txt?rev=1148579&r1=1148578&r2=1148579&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20-security/CHANGES.txt (original) +++ hadoop/common/branches/branch-0.20-security/CHANGES.txt Tue Jul 19 23:01:45 2011 @@ -20,6 +20,9 @@ Release 0.20.205.0 - unreleased HDFS-1836. Thousand of CLOSE_WAIT socket. Contributed by Todd Lipcon, ported to security branch by Bharath Mundlapudi. (via mattf) + HADOOP-7432. Back-port HADOOP-7110 to 0.20-security: Implement chmod + in NativeIO library. (Sherry Chen via mattf) + Release 0.20.204.0 - unreleased NEW FEATURES Modified: hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java?rev=1148579&r1=1148578&r2=1148579&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java (original) +++ hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java Tue Jul 19 23:01:45 2011 @@ -26,6 +26,7 @@ import java.util.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.permission.*; +import org.apache.hadoop.io.nativeio.NativeIO; import org.apache.hadoop.util.Progressable; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.Shell; @@ -529,8 +530,13 @@ public class RawLocalFileSystem extends private void execSetPermission(File f, FsPermission permission) throws IOException { - execCommand(f, Shell.SET_PERMISSION_COMMAND, - String.format("%04o", permission.toShort())); + if (NativeIO.isAvailable()) { + NativeIO.chmod(f.getCanonicalPath(), + permission.toShort()); + } else { + execCommand(f, Shell.SET_PERMISSION_COMMAND, + String.format("%04o", permission.toShort())); + } } private static String execCommand(File f, String... cmd) throws IOException { Modified: hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java?rev=1148579&r1=1148578&r2=1148579&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java (original) +++ hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java Tue Jul 19 23:01:45 2011 @@ -79,11 +79,13 @@ public class NativeIO { //TODO: fstat is an old implementation. Doesn't use the cache. This should be //changed to use the cache. public static native Stat fstat(FileDescriptor fd) throws IOException; + private static native long getUIDforFDOwnerforOwner(FileDescriptor fd) throws IOException; private static native String getUserName(long uid) throws IOException; /** Initialize the JNI method ID and class ID cache */ private static native void initNative(); - + /** Wrapper around chmod(2) */ + public static native void chmod(String path, int mode) throws IOException; private static class CachedUid { final long timestamp; final String username; Modified: hadoop/common/branches/branch-0.20-security/src/native/config.h.in URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/native/config.h.in?rev=1148579&r1=1148578&r2=1148579&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20-security/src/native/config.h.in (original) +++ hadoop/common/branches/branch-0.20-security/src/native/config.h.in Tue Jul 19 23:01:45 2011 @@ -82,6 +82,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION Modified: hadoop/common/branches/branch-0.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c?rev=1148579&r1=1148578&r2=1148579&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c (original) +++ hadoop/common/branches/branch-0.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c Tue Jul 19 23:01:45 2011 @@ -266,6 +266,24 @@ cleanup: return jstr_username; } +/** + * public static native void chmod(String path, int mode) throws IOException; + */ +JNIEXPORT void JNICALL +Java_org_apache_hadoop_io_nativeio_NativeIO_chmod( + JNIEnv *env, jclass clazz, jstring j_path, + jint mode) +{ + const char *path = (*env)->GetStringUTFChars(env, j_path, NULL); + if (path == NULL) return; // JVM throws Exception for us + + if (chmod(path, mode) != 0) { + throw_ioe(env, errno); + } + + (*env)->ReleaseStringUTFChars(env, j_path, path); +} + /* * Throw a java.IO.IOException, generating the message from errno. */ Modified: hadoop/common/branches/branch-0.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java?rev=1148579&r1=1148578&r2=1148579&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java (original) +++ hadoop/common/branches/branch-0.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java Tue Jul 19 23:01:45 2011 @@ -28,7 +28,11 @@ import static org.junit.Assert.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileUtil; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.util.NativeCodeLoader; public class TestNativeIO { @@ -136,4 +140,34 @@ public class TestNativeIO { } } + /** + * Test basic chmod operation + */ + @Test + public void testChmod() throws Exception { + try { + NativeIO.chmod("/this/file/doesnt/exist", 777); + fail("Chmod of non-existent file didn't fail"); + } catch (NativeIOException nioe) { + assertEquals(Errno.ENOENT, nioe.getErrno()); + } + + File toChmod = new File(TEST_DIR, "testChmod"); + assertTrue("Create test subject", + toChmod.exists() || toChmod.mkdir()); + NativeIO.chmod(toChmod.getAbsolutePath(), 0777); + assertPermissions(toChmod, 0777); + NativeIO.chmod(toChmod.getAbsolutePath(), 0000); + assertPermissions(toChmod, 0000); + NativeIO.chmod(toChmod.getAbsolutePath(), 0644); + assertPermissions(toChmod, 0644); + } + + private void assertPermissions(File f, int expected) throws IOException { + FileSystem localfs = FileSystem.getLocal(new Configuration()); + FsPermission perms = localfs.getFileStatus( + new Path(f.getAbsolutePath())).getPermission(); + assertEquals(expected, perms.toShort()); + } + }