Ok, looks like you won the prize. It also looks like I can learn a
little from this. It helps me a TON!

I have yet to test the code, but take a look at copyleft.net and let me
know what you want shipped to you, or else I'll just give you a grab bag
pick of some item. (I like the Perl DVD Decryption or Black Ops Admin
T-shirts...) If you like stuff at thinkgeek, I'll do that too.

If you like, send your address in private email.

On 06/12, Neil Watkiss rearranged the electrons to read:
> Here's a solution worth at _least_ $20.00. (What a whore I am :)
> 
> list_dir() returns a list of arrays which contain this information about
> the directory entries:
> 
> 1. Full pathname
> 2. File type (DIR, REG, LNK, CHR, BLK, FIFO, SOCK, or ???)
> 3. Device number
> 4. Inode number
> 5. Owner's UID
> 6. Owner's GID
> 7. Size of the file
> 8. Access time
> 9. Modification time
> 10. Change time
> 11. Can _this script_ read this file?
> 12. Can _this script_ write to this file?
> 13. Can _this script_ execute this file?
> 
> If you want more information about the file, just stick it in the array
> from the C section.
> 
> Here's an example usage:
> 
> ----8<----
> use Inline C;
> use Data::Dumper;
> my @list = list_dir('/');
> print Dumper \@list;
> __END__
> __C__
> ... see attached script
> ---->8----
> 
> Here's the first few lines of output, edited for brevity:
> 
> ----8<----
> $VAR1 = [
>           [
>             '/lost+found', 'DIR', 2050, 11, 2, 0, 0, 16384,
>             992343723, 967726697, 967726697,
>             1, 0, 1
>           ],
>           [
>             '/var', 'DIR', 2053, 2, 20, 0, 0, 1024,
>             992343723, 967753497, 967753497,
>             1, 0, 1
>           ],
>           [
>             '/proc', 'DIR', 1, 1, 83, 0, 0, 0,
>             992010074, 992010074, 992010074,
>             1, 0, 1
>           ],
> ---->8----
> 
> Later,
> Neil
> 

> use Inline C;
> use Data::Dumper;
> 
> my $path = shift || '/';
> $path .= "/" unless substr($path, -1) eq '/';
> my @list = list_dir($path);
> 
> print Dumper \@list;
> 
> __END__
> __C__
> 
> /* All code made up -- distribute freely */
> static void _perm(AV *l, struct stat *s) {
>     uid_t uid, gid;
>     SV *can_r, *can_w, *can_x;
> 
>     uid = getuid();
>     gid = getgid();
> 
>     if (uid == s->st_uid) {
>         can_r = newSViv( (s->st_mode & S_IRUSR) ? 1 : 0);
>         can_w = newSViv( (s->st_mode & S_IWUSR) ? 1 : 0);
>         can_x = newSViv( (s->st_mode & S_IXUSR) ? 1 : 0);
>     }
>     else if (gid == s->st_gid) {
>         can_r = newSViv( (s->st_mode & S_IRGRP) ? 1 : 0);
>         can_w = newSViv( (s->st_mode & S_IWGRP) ? 1 : 0);
>         can_x = newSViv( (s->st_mode & S_IXGRP) ? 1 : 0);
>     }
>     else {
>         can_r = newSViv( (s->st_mode & S_IROTH) ? 1 : 0);
>         can_w = newSViv( (s->st_mode & S_IWOTH) ? 1 : 0);
>         can_x = newSViv( (s->st_mode & S_IXOTH) ? 1 : 0);
>     }
>     av_push(l, can_r);
>     av_push(l, can_w);
>     av_push(l, can_x);
> }
> 
> /* pre-condition: path has a trailing slash */
> void list_dir(char *path) {
>     DIR *dir;
>     struct dirent *entry;
>     struct stat stat_buf;
>     SV *fullname = sv_2mortal(newSVpv("", 0));
>     Inline_Stack_Vars;
> 
>     if (path==NULL)
>       return;
>     if ((dir = opendir(path)) == NULL)
>       croak("%s: %s\n", path, strerror(errno));
> 
>     Inline_Stack_Reset;
>     while ((entry = readdir(dir)) != NULL) {
>       AV *s_info;
> 
>       /* skip current directory & parent directory */
>       if (strcmp(entry->d_name, ".")  == 0 ||
>           strcmp(entry->d_name, "..") == 0)
>         continue;
> 
>       /* save the full pathname (extra slashes are ignored in Linux) */
>       sv_setpvf(fullname, "%s%s", path, entry->d_name);
> 
>       /* stat the file (without following symlinks) */
>       if (lstat(SvPV(fullname, PL_na), &stat_buf)) {
>           warn("%s: %s\n", SvPV(fullname, PL_na), strerror(errno));
>           continue;
>       }
> 
>       /* Build some info about it:
>          [ NAME, TYPE, DEV, INODE, NLINK, UID, GID, SIZE, 
>            ATIME, MTIME, CTIME, R, W, X ]
>        */
>       s_info = newAV();
>       av_push(s_info, newSVsv(fullname));
>       av_push(s_info, newSVpv((S_ISLNK(stat_buf.st_mode) ? "LNK" :
>                                S_ISREG(stat_buf.st_mode) ? "REG" : 
>                                S_ISDIR(stat_buf.st_mode) ? "DIR" : 
>                                S_ISCHR(stat_buf.st_mode) ? "CHR" :
>                                S_ISBLK(stat_buf.st_mode) ? "BLK" :
>                                S_ISFIFO(stat_buf.st_mode) ? "FIFO" :
>                                S_ISSOCK(stat_buf.st_mode) ? "SOCK" : "???"),
>                               0));
>       av_push(s_info, newSViv(stat_buf.st_dev));
>       av_push(s_info, newSViv(stat_buf.st_ino));
>       av_push(s_info, newSViv(stat_buf.st_nlink));
>       av_push(s_info, newSViv(stat_buf.st_uid));
>       av_push(s_info, newSViv(stat_buf.st_gid));
>       av_push(s_info, newSViv(stat_buf.st_size));
>       av_push(s_info, newSViv(stat_buf.st_atime));
>       av_push(s_info, newSViv(stat_buf.st_mtime));
>       av_push(s_info, newSViv(stat_buf.st_ctime));
>       _perm(s_info, &stat_buf);
> 
>       /* Return the info */
>       Inline_Stack_Push(newRV_noinc((SV*)s_info));
>     }
>     Inline_Stack_Done;
> }

--
Hob Goblin
[EMAIL PROTECTED]

I bought my brother some gift-wrap for Christmas. I took it to the Gift
Wrap department and told them to wrap it, but in a different print so he
would know when to stop unwrapping.
                                                -- Stephen Wright

Reply via email to