HADOOP-9483. winutils support for readlink command. Contributed by Arpit Agarwal.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1478592 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
76461d8039
commit
afa786098a
|
@ -542,6 +542,9 @@ Trunk (Unreleased)
|
||||||
|
|
||||||
HADOOP-9043. Disallow in winutils creating symlinks with forwards slashes.
|
HADOOP-9043. Disallow in winutils creating symlinks with forwards slashes.
|
||||||
(Chris Nauroth and Arpit Agarwal via suresh)
|
(Chris Nauroth and Arpit Agarwal via suresh)
|
||||||
|
|
||||||
|
HADOOP-9483. winutils support for readlink command.
|
||||||
|
(Arpit Agarwal via suresh)
|
||||||
|
|
||||||
Release 2.0.5-beta - UNRELEASED
|
Release 2.0.5-beta - UNRELEASED
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,9 @@ void TaskUsage();
|
||||||
int Symlink(__in int argc, __in_ecount(argc) wchar_t *argv[]);
|
int Symlink(__in int argc, __in_ecount(argc) wchar_t *argv[]);
|
||||||
void SymlinkUsage();
|
void SymlinkUsage();
|
||||||
|
|
||||||
|
int Readlink(__in int argc, __in_ecount(argc) wchar_t *argv[]);
|
||||||
|
void ReadlinkUsage();
|
||||||
|
|
||||||
int SystemInfo();
|
int SystemInfo();
|
||||||
void SystemInfoUsage();
|
void SystemInfoUsage();
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,10 @@ int wmain(__in int argc, __in_ecount(argc) wchar_t* argv[])
|
||||||
{
|
{
|
||||||
return Symlink(argc - 1, argv + 1);
|
return Symlink(argc - 1, argv + 1);
|
||||||
}
|
}
|
||||||
|
else if (wcscmp(L"readlink", cmd) == 0)
|
||||||
|
{
|
||||||
|
return Readlink(argc - 1, argv + 1);
|
||||||
|
}
|
||||||
else if (wcscmp(L"task", cmd) == 0)
|
else if (wcscmp(L"task", cmd) == 0)
|
||||||
{
|
{
|
||||||
return Task(argc - 1, argv + 1);
|
return Task(argc - 1, argv + 1);
|
||||||
|
@ -105,6 +109,10 @@ The available commands and their usages are:\n\n", program);
|
||||||
SymlinkUsage();
|
SymlinkUsage();
|
||||||
fwprintf(stdout, L"\n\n");
|
fwprintf(stdout, L"\n\n");
|
||||||
|
|
||||||
|
fwprintf(stdout, L"%-10s%s\n\n", L"readlink", L"Print the target of a symbolic link.");
|
||||||
|
ReadlinkUsage();
|
||||||
|
fwprintf(stdout, L"\n\n");
|
||||||
|
|
||||||
fwprintf(stdout, L"%-15s%s\n\n", L"systeminfo", L"System information.");
|
fwprintf(stdout, L"%-15s%s\n\n", L"systeminfo", L"System information.");
|
||||||
SystemInfoUsage();
|
SystemInfoUsage();
|
||||||
fwprintf(stdout, L"\n\n");
|
fwprintf(stdout, L"\n\n");
|
||||||
|
|
|
@ -160,6 +160,7 @@
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="readlink.c" />
|
||||||
<ClCompile Include="symlink.c" />
|
<ClCompile Include="symlink.c" />
|
||||||
<ClCompile Include="systeminfo.c" />
|
<ClCompile Include="systeminfo.c" />
|
||||||
<ClCompile Include="chmod.c" />
|
<ClCompile Include="chmod.c" />
|
||||||
|
@ -178,4 +179,4 @@
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -33,6 +33,8 @@ import org.apache.hadoop.fs.FileUtil;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import static org.junit.Assume.*;
|
||||||
|
import static org.hamcrest.CoreMatchers.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test cases for helper Windows winutils.exe utility.
|
* Test cases for helper Windows winutils.exe utility.
|
||||||
|
@ -359,4 +361,85 @@ public class TestWinUtils {
|
||||||
"Expected: Failed to create symlink with forward slashes in target");
|
"Expected: Failed to create symlink with forward slashes in target");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test (timeout = 30000)
|
||||||
|
public void testReadLink() throws IOException {
|
||||||
|
// Create TEST_DIR\dir1\file1.txt
|
||||||
|
//
|
||||||
|
File dir1 = new File(TEST_DIR, "dir1");
|
||||||
|
assertTrue(dir1.mkdirs());
|
||||||
|
|
||||||
|
File file1 = new File(dir1, "file1.txt");
|
||||||
|
assertTrue(file1.createNewFile());
|
||||||
|
|
||||||
|
File dirLink = new File(TEST_DIR, "dlink");
|
||||||
|
File fileLink = new File(TEST_DIR, "flink");
|
||||||
|
|
||||||
|
// Next create a directory symlink to dir1 and a file
|
||||||
|
// symlink to file1.txt.
|
||||||
|
//
|
||||||
|
Shell.execCommand(
|
||||||
|
Shell.WINUTILS, "symlink", dirLink.toString(), dir1.toString());
|
||||||
|
Shell.execCommand(
|
||||||
|
Shell.WINUTILS, "symlink", fileLink.toString(), file1.toString());
|
||||||
|
|
||||||
|
// Read back the two links and ensure we get what we expected.
|
||||||
|
//
|
||||||
|
String readLinkOutput = Shell.execCommand(Shell.WINUTILS,
|
||||||
|
"readlink",
|
||||||
|
dirLink.toString());
|
||||||
|
assertThat(readLinkOutput, equalTo(dir1.toString()));
|
||||||
|
|
||||||
|
readLinkOutput = Shell.execCommand(Shell.WINUTILS,
|
||||||
|
"readlink",
|
||||||
|
fileLink.toString());
|
||||||
|
assertThat(readLinkOutput, equalTo(file1.toString()));
|
||||||
|
|
||||||
|
// Try a few invalid inputs and verify we get an ExitCodeException for each.
|
||||||
|
//
|
||||||
|
try {
|
||||||
|
// No link name specified.
|
||||||
|
//
|
||||||
|
Shell.execCommand(Shell.WINUTILS, "readlink", "");
|
||||||
|
fail("Failed to get Shell.ExitCodeException when reading bad symlink");
|
||||||
|
} catch (Shell.ExitCodeException ece) {
|
||||||
|
assertThat(ece.getExitCode(), is(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Bad link name.
|
||||||
|
//
|
||||||
|
Shell.execCommand(Shell.WINUTILS, "readlink", "ThereIsNoSuchLink");
|
||||||
|
fail("Failed to get Shell.ExitCodeException when reading bad symlink");
|
||||||
|
} catch (Shell.ExitCodeException ece) {
|
||||||
|
assertThat(ece.getExitCode(), is(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Non-symlink directory target.
|
||||||
|
//
|
||||||
|
Shell.execCommand(Shell.WINUTILS, "readlink", dir1.toString());
|
||||||
|
fail("Failed to get Shell.ExitCodeException when reading bad symlink");
|
||||||
|
} catch (Shell.ExitCodeException ece) {
|
||||||
|
assertThat(ece.getExitCode(), is(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Non-symlink file target.
|
||||||
|
//
|
||||||
|
Shell.execCommand(Shell.WINUTILS, "readlink", file1.toString());
|
||||||
|
fail("Failed to get Shell.ExitCodeException when reading bad symlink");
|
||||||
|
} catch (Shell.ExitCodeException ece) {
|
||||||
|
assertThat(ece.getExitCode(), is(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Too many parameters.
|
||||||
|
//
|
||||||
|
Shell.execCommand(Shell.WINUTILS, "readlink", "a", "b");
|
||||||
|
fail("Failed to get Shell.ExitCodeException with bad parameters");
|
||||||
|
} catch (Shell.ExitCodeException ece) {
|
||||||
|
assertThat(ece.getExitCode(), is(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue