#!/usr/bin/env perl use 5.012; use strict; use warnings; use Data::Dumper qw(Dumper); my $str = &listfiles('<directory>'); print Dumper \$str; use Inline C => <<'END_OF_C_CODE'; #include <dirent.h> /* Defines DT_* constants */ #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/syscall.h> #define handle_error(msg) do { perror(msg); exit(EXIT_FAILURE); } whil +e (0) struct linux_dirent { long d_ino; off_t d_off; unsigned short d_reclen; char d_name[]; }; #define BUF_SIZE 1024*1024*5 SV* listfiles(const char * dir) { int fd, nread; char buf[BUF_SIZE]; struct linux_dirent *d; int bpos; char d_type; char inode; HV* hash = newHV(); 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) { size_t nbytes = snprintf(NULL, 0, "%d", d->d_ino) + 1; char *inode = malloc(nbytes); snprintf(inode, nbytes, "%d", d->d_ino); hv_store(hash, inode, strlen(inode), newSVpvf("%s",(cha +r *) d->d_name, 0), 0); } bpos += d->d_reclen; } } return newRV_noinc((SV*) hash); } END_OF_C_CODE
In reply to Re^3: using syscalls in perl through inline c
by ofer
in thread using syscalls in perl through inline c
by ofer
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |