@@ -98,6 +98,41 @@ fn test_mkfifo_directory() {
9898 assert ! ( mkfifo( & env:: temp_dir( ) , Mode :: S_IRUSR ) . is_err( ) ) ;
9999}
100100
101+ #[ test]
102+ fn test_mkfifoat ( ) {
103+ let tempdir = tempfile:: tempdir ( ) . unwrap ( ) ;
104+ let mkfifoat_fifo = tempdir. path ( ) . join ( "mkfifoat_fifo" ) ;
105+
106+ mkfifoat ( None , & mkfifoat_fifo, Mode :: S_IRUSR ) . unwrap ( ) ;
107+
108+ let stats = stat:: stat ( & mkfifoat_fifo) . unwrap ( ) ;
109+ let typ = stat:: SFlag :: from_bits_truncate ( stats. st_mode ) ;
110+ assert ! ( typ == SFlag :: S_IFIFO ) ;
111+
112+
113+ let dirfd = open ( tempdir. path ( ) , OFlag :: empty ( ) , Mode :: empty ( ) ) . unwrap ( ) ;
114+ let mkfifoat_name = "mkfifoat_name" ;
115+
116+ mkfifoat ( Some ( dirfd) , mkfifoat_name, Mode :: S_IRUSR ) . unwrap ( ) ;
117+
118+ let stats = stat:: fstatat ( dirfd, mkfifoat_name, fcntl:: AtFlags :: empty ( ) ) . unwrap ( ) ;
119+ let typ = stat:: SFlag :: from_bits_truncate ( stats. st_mode ) ;
120+ assert ! ( typ == SFlag :: S_IFIFO ) ;
121+ }
122+
123+ #[ test]
124+ fn test_mkfifoat_directory ( ) {
125+ // mkfifoat should fail if a directory is given
126+ assert ! ( mkfifoat( None , & env:: temp_dir( ) , Mode :: S_IRUSR ) . is_err( ) ) ;
127+
128+ let tempdir = tempfile:: tempdir ( ) . unwrap ( ) ;
129+ let dirfd = open ( tempdir. path ( ) , OFlag :: empty ( ) , Mode :: empty ( ) ) . unwrap ( ) ;
130+ let mkfifoat_dir = "mkfifoat_dir" ;
131+ stat:: mkdirat ( dirfd, mkfifoat_dir, Mode :: S_IRUSR ) . unwrap ( ) ;
132+
133+ assert ! ( mkfifoat( Some ( dirfd) , mkfifoat_dir, Mode :: S_IRUSR ) . is_err( ) ) ;
134+ }
135+
101136#[ test]
102137fn test_getpid ( ) {
103138 let pid: :: libc:: pid_t = getpid ( ) . into ( ) ;
0 commit comments