Everything was working fine until I recently tried again to use it: binary data returned is not following anymore the expected pattern (using unpack for that) and I don't know why. The pattern was created by following the getdents documentation and I'm running in two problems:
Trying to debug, I went over the perl code and C (working) code and forced both to write to binary files (open with :raw in Perl and fopen/fwrite in C) and compared the output of hexdump from both:
I tried running those tests both with the standard perl shipped with the Linux distribution and with v5.24.0 compiled with perlbrew. Results are the same.
And here is the output from strace by running both programs (only after opening the directory:
From C program:
open("/home/alcjunio/hardlist.output", O_WRONLY|O_CREAT|O_TRUNC, 0666)
+ = 4
getdents(3, /* 1002 entries */, 5242880) = 32048
fstat(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffd778f920) = -1 ENOTTY (I
+nappropriate ioctl for device)
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
+0) = 0x7f696e37b000
fstat(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
+0) = 0x7f696e37a000
write(4, "B\355\t\0\0\0\0\0\1\0\0\0\0\0\0\0\30\0.\0\0\0\0\4\342l\10\0\
+0\0\0\0"..., 4096) = 4096
write(4, "\1\357\t\0\0\0\0\0\261\207\223\7\0\0\0\0 \0xaaaaaaaaqw\0\0\1
+0"..., 4096) = 4096
write(4, "\334\357\t\0\0\0\0\0\211\234s\20\0\0\0\0 \0xaaaaaaaaze\0\0\1
+0"..., 4096) = 4096
write(4, "\222\356\t\0\0\0\0\0\224\22\364\27\0\0\0\0 \0xaaaaaaaamt\0\0
+\10"..., 4096) = 4096
write(4, "\4\356\t\0\0\0\0\0\262\203\307\37\0\0\0\0 \0xaaaaaaaahk\0\0\
+10"..., 4096) = 4096
write(1, ".\n..\nxaaaaaaaaff\nxaaaaaaabdu\nxaa"..., 4096) = 4096
write(4, "\230\355\t\0\0\0\0\0>\327\16)\0\0\0\0 \0xaaaaaaaadg\0\0\10".
+.., 4096) = 4096
write(4, ",\356\t\0\0\0\0\0\271\343\0050\0\0\0\0 \0xaaaaaaaaix\0\0\10"
+..., 4096) = 4096
write(4, "W\356\t\0\0\0\0\0002\247p8\0\0\0\0 \0xaaaaaaaako\0\0\10"...,
+ 4096) = 4096
write(4, "\203\356\t\0\0\0\0\0\4!\274?\0\0\0\0 \0xaaaaaaaame\0\0\10"..
+., 4096) = 4096
write(4, "\325\357\t\0\0\0\0\0\"\216\34G\0\0\0\0 \0xaaaaaaaayx\0\0\10"
+..., 4096) = 4096
write(1, "\nxaaaaaaabhm\nxaaaaaaaalr\nxaaaaaa"..., 4096) = 4096
write(4, "\245\356\t\0\0\0\0\0\341P#O\0\0\0\0 \0xaaaaaaaanm\0\0\10"...
+, 4096) = 4096
write(4, "I\357\t\0\0\0\0\0\374]\206V\0\0\0\0 \0xaaaaaaaatq\0\0\10"...
+, 4096) = 4096
write(4, "\346\357\t\0\0\0\0\0\232\351\226`\0\0\0\0 \0xaaaaaaaazo\0\0\
+10"..., 4096) = 4096
write(4, "r\360\t\0\0\0\0\0%CTi\0\0\0\0 \0xaaaaaaabew\0\0\10"..., 4096
+) = 4096
write(4, "t\360\t\0\0\0\0\0007\222^q\0\0\0\0 \0xaaaaaaabey\0\0\10"...,
+ 4096) = 4096
getdents(3, /* 0 entries */, 5242880) = 0
write(4, "\235\356\t\0\0\0\0\0\316H\265z\0\0\0\0 \0xaaaaaaaane\0\0\10"
+..., 2688) = 2688
close(4) = 0
munmap(0x7f696e37a000, 4096) = 0
write(1, "aaaaaama\nxaaaaaaaado\nxaaaaaaaajw"..., 3813) = 3813
exit_group(0) = ?
From Perl program:
open("sample/", O_RDONLY|O_DIRECTORY) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff56bc6bf0) = -1 ENOTTY (I
+nappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
fstat(3, {st_mode=S_IFDIR|0775, st_size=36864, ...}) = 0
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
open("perldata.bin", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff56bc6b50) = -1 ENOTTY (I
+nappropriate ioctl for device)
lseek(4, 0, SEEK_CUR) = 0
fstat(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
getdents(3, /* 128 entries */, 4096) = 4080
write(4, "B\355\t\0\0\0\0\0\1\0\0\0\0\0\0\0\30\0.\0\0\0\0\4\342l\10\0\
+0\0\0\0"..., 4096) = 4096
close(4) = 0
close(3) = 0
rt_sigaction(SIGHUP, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGILL, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTRAP, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGABRT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGBUS, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGFPE, NULL, {0x1, [FPE], SA_RESTORER|SA_RESTART, 0x3cb8
+830030}, 8) = 0
rt_sigaction(SIGKILL, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGUSR1, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSEGV, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGUSR2, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGPIPE, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGALRM, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTERM, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSTKFLT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGCONT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSTOP, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTSTP, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTTIN, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTTOU, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGURG, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGXCPU, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGXFSZ, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGVTALRM, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGPROF, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGWINCH, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGIO, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGPWR, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSYS, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_2, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_3, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_4, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_5, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_6, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_7, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_8, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_9, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_10, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_11, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_12, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_13, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_14, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_15, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_16, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_17, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_18, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_19, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_20, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_21, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_22, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_23, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_24, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_25, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_26, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_27, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_28, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_29, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_30, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_31, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGRT_32, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGABRT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGIO, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSYS, NULL, {SIG_DFL, [], 0}, 8) = 0
exit_group(0) = ?
Thanks to Corion and the anonymous monk too shy to identify himself. :-)