void S_IFMT(...) PREINIT: dXSTARG; PPCODE: PUSHu(items ? (SvUV(ST(0)) & S_IFMT) : S_IFMT); #### #!/usr/bin/env perl use strict; use warnings; use Fcntl qw[]; printf "%08x\n", (stat("/tmp"))[2]; printf "%08x\n", (stat("/etc/passwd"))[2]; printf "%08x\n", Fcntl::S_IFMT( (stat("/tmp"))[2] ); printf "%08x\n", Fcntl::S_IFMT( (stat("/etc/passwd"))[2] ); printf "%08x\n", Fcntl::S_IFMT(); __END__ 000043ff 000081a4 00004000 00008000 0000f000 #### #!/usr/bin/env perl use strict; use warnings; use Fcntl qw[]; for my $file ('/tmp/testlink', '/etc/passwd', '/etc') { print "--- $file is link: ", -l $file, "\n"; my $mode = (stat($file))[2]; my $lmode = (lstat($file))[2]; printf "mode: %016b\n", $mode; printf "lmode: %016b\n", $lmode; printf "S_IFMT(): %016b\n", Fcntl::S_IFMT($lmode); printf "S_IFMT: %016b\n", Fcntl::S_IFMT() & $lmode; printf "S_IFMT: %016b\n", Fcntl::S_IFMT(); printf "S_IFLNK: %016b\n", Fcntl::S_IFLNK(); printf "S_IFLNK: %016b\n", (Fcntl::S_IFLNK() & Fcntl::S_IFMT() & $lmode) == Fcntl::S_IFLNK() ; printf "S_ISLNK():%016b\n", Fcntl::S_ISLNK($lmode); print "---\n"; } __END__ --- /tmp/testlink is link: 1 mode: 0100001111111111 lmode: 1010000111111111 S_IFMT(): 1010000000000000 S_IFMT: 1010000000000000 S_IFMT: 1111000000000000 S_IFLNK: 1010000000000000 S_IFLNK: 0000000000000001 S_ISLNK():0000000000000001 --- --- /etc/passwd is link: mode: 1000000110100100 lmode: 1000000110100100 S_IFMT(): 1000000000000000 S_IFMT: 1000000000000000 S_IFMT: 1111000000000000 S_IFLNK: 1010000000000000 S_IFLNK: 0000000000000000 S_ISLNK():0000000000000000 --- --- /etc is link: mode: 0100000111101101 lmode: 0100000111101101 S_IFMT(): 0100000000000000 S_IFMT: 0100000000000000 S_IFMT: 1111000000000000 S_IFLNK: 1010000000000000 S_IFLNK: 0000000000000000 S_ISLNK():0000000000000000 ---