Introduce Path#isSpecialFile, FileSystem#isSpecialFile, and FileStatus#isSpecialFile to help disambiguate between a regular file and a special file, since the file size of a special file cannot be trusted.

--
MOS_MIGRATED_REVID=105903622
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/UnixFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/vfs/UnixFileSystemTest.java
index cb5685e..40ace2b 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/UnixFileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/UnixFileSystemTest.java
@@ -15,8 +15,10 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.google.devtools.build.lib.unix.FilesystemUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -60,4 +62,20 @@
       // Expected.
     }
   }
+
+  @Test
+  public void testIsSpecialFile() throws Exception {
+    Path regular = absolutize("regular");
+    Path fifo = absolutize("fifo");
+    FileSystemUtils.createEmptyFile(regular);
+    FilesystemUtils.mkfifo(fifo.toString(), 0777);
+    assertTrue(regular.isFile());
+    assertFalse(regular.isSpecialFile());
+    assertTrue(regular.stat().isFile());
+    assertFalse(regular.stat().isSpecialFile());
+    assertTrue(fifo.isFile());
+    assertTrue(fifo.isSpecialFile());
+    assertTrue(fifo.stat().isFile());
+    assertTrue(fifo.stat().isSpecialFile());
+  }
 }