Il giorno gio 31 ott 2024 alle ore 08:09 Sergey Poznyakoff
<[email protected]> ha scritto:
>
> FWIW, the main question is actually: why
> lseek succeeded when reading from stdin?
>
For this question, I think that the ability to seek in a fd is not
stdin vs file, but more pipe vs file.
e.g.
tar -tf lib.tar # seekable
tar -t <lib.tar # seekable
cat lib.tar |tar -t # NOT seekable
This is detected in get_archive_status() by checking S_ISREG() or
S_ISBLK(), indeed lseek works on fd 0:
$ strace -elseek tar -t <lib.tar >/dev/null
lseek(0, 51200, SEEK_CUR) = 61440
lseek(0, 81920, SEEK_CUR) = 174080
lseek(0, 61440, SEEK_CUR) = 245760
lseek(0, 10240, SEEK_CUR) = 307200
lseek(0, 20480, SEEK_CUR) = 378880
lseek(0, 61440, SEEK_CUR) = 450560
lseek(0, 71680, SEEK_CUR) = 532480
lseek(0, 163840, SEEK_CUR) = 706560
lseek(0, 358400, SEEK_CUR) = 1075200
+++ exited with 0 +++
Regards,
--
Matteo Croce
perl -e 'for($t=0;;$t++){print chr($t*($t>>8|$t>>13)&255)}' |aplay