#!/usr/bin/env perl use 5.012; use strict; use warnings; my $str = listfiles('/home/steve/test'); print $str; use Inline C => <<'END_OF_C_CODE'; #include /* Defines DT_* constants */ #include #include #include #include #include #include #define handle_error(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0) struct linux_dirent { long d_ino; off_t d_off; unsigned short d_reclen; char d_name[]; }; #define BUF_SIZE 1024*1024*5 /**** CHANGED LINE BELOW ***/ int listfiles(const char * dir) { int fd, nread; char buf[BUF_SIZE]; struct linux_dirent *d; int bpos; char d_type; /**** CHANGED LINE BELOW ****/ fd = open(dir, O_RDONLY | O_DIRECTORY); if (fd == -1) handle_error("open"); for ( ; ; ) { nread = syscall(SYS_getdents, fd, buf, BUF_SIZE); if (nread == -1) handle_error("getdents"); if (nread == 0) break; for (bpos = 0; bpos < nread;) { d = (struct linux_dirent *) (buf + bpos); if (d->d_ino != 0) printf("%s\n", (char *) d->d_name); bpos += d->d_reclen; } } exit(EXIT_SUCCESS); } END_OF_C_CODE #### one.txt two.txt #### if (! defined $ARGV[0]){ print "Usage: script.pl \n"; exit; } my $dir = $ARGV[0]; my $str = listfiles($dir); ...