/usr/share/perl5/File/HomeDir/Darwin/Carbon.pm is in libfile-homedir-perl 0.98-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | package File::HomeDir::Darwin::Carbon;
# Basic implementation for the Dawin family of operating systems.
# This includes (most prominently) Mac OS X.
use 5.00503;
use strict;
use Cwd ();
use Carp ();
use File::HomeDir::Darwin ();
use vars qw{$VERSION @ISA};
BEGIN {
$VERSION = '0.98';
# This is only a child class of the pure Perl darwin
# class so that we can do homedir detection of all three
# drivers at one via ->isa.
@ISA = 'File::HomeDir::Darwin';
# Load early if in a forking environment and we have
# prefork, or at run-time if not.
local $@;
eval "use prefork 'Mac::Files'";
}
#####################################################################
# Current User Methods
sub my_home {
my $class = shift;
# A lot of unix people and unix-derived tools rely on
# the ability to overload HOME. We will support it too
# so that they can replace raw HOME calls with File::HomeDir.
if ( exists $ENV{HOME} and defined $ENV{HOME} ) {
return $ENV{HOME};
}
require Mac::Files;
$class->_find_folder(
Mac::Files::kCurrentUserFolderType(),
);
}
sub my_desktop {
my $class = shift;
require Mac::Files;
$class->_find_folder(
Mac::Files::kDesktopFolderType(),
);
}
sub my_documents {
my $class = shift;
require Mac::Files;
$class->_find_folder(
Mac::Files::kDocumentsFolderType(),
);
}
sub my_data {
my $class = shift;
require Mac::Files;
$class->_find_folder(
Mac::Files::kApplicationSupportFolderType(),
);
}
sub my_music {
my $class = shift;
require Mac::Files;
$class->_find_folder(
Mac::Files::kMusicDocumentsFolderType(),
);
}
sub my_pictures {
my $class = shift;
require Mac::Files;
$class->_find_folder(
Mac::Files::kPictureDocumentsFolderType(),
);
}
sub my_videos {
my $class = shift;
require Mac::Files;
$class->_find_folder(
Mac::Files::kMovieDocumentsFolderType(),
);
}
sub _find_folder {
my $class = shift;
my $name = shift;
require Mac::Files;
my $folder = Mac::Files::FindFolder(
Mac::Files::kUserDomain(),
$name,
);
return undef unless defined $folder;
unless ( -d $folder ) {
# Make sure that symlinks resolve to directories.
return undef unless -l $folder;
my $dir = readlink $folder or return;
return undef unless -d $dir;
}
return Cwd::abs_path($folder);
}
#####################################################################
# Arbitrary User Methods
sub users_home {
my $class = shift;
my $home = $class->SUPER::users_home(@_);
return defined $home ? Cwd::abs_path($home) : undef;
}
# in theory this can be done, but for now, let's cheat, since the
# rest is Hard
sub users_desktop {
my ($class, $name) = @_;
return undef if $name eq 'root';
$class->_to_user( $class->my_desktop, $name );
}
sub users_documents {
my ($class, $name) = @_;
return undef if $name eq 'root';
$class->_to_user( $class->my_documents, $name );
}
sub users_data {
my ($class, $name) = @_;
$class->_to_user( $class->my_data, $name )
||
$class->users_home($name);
}
# cheap hack ... not entirely reliable, perhaps, but ... c'est la vie, since
# there's really no other good way to do it at this time, that i know of -- pudge
sub _to_user {
my ($class, $path, $name) = @_;
my $my_home = $class->my_home;
my $users_home = $class->users_home($name);
defined $users_home or return undef;
$path =~ s/^\Q$my_home/$users_home/;
return $path;
}
1;
=pod
=head1 NAME
File::HomeDir::Darwin - Find your home and other directories on Darwin (OS X)
=head1 DESCRIPTION
This module provides Darwin-specific implementations for determining
common user directories. In normal usage this module will always be
used via L<File::HomeDir>.
Note -- since this module requires Mac::Carbon and Mac::Carbon does
not work with 64-bit perls, on such systems, File::HomeDir will try
L<File::HomeDir::Darwin::Cocoa> and then fall back to the (pure Perl)
L<File::HomeDir::Darwin>.
=head1 SYNOPSIS
use File::HomeDir;
# Find directories for the current user
$home = File::HomeDir->my_home; # /Users/mylogin
$desktop = File::HomeDir->my_desktop; # /Users/mylogin/Desktop
$docs = File::HomeDir->my_documents; # /Users/mylogin/Documents
$music = File::HomeDir->my_music; # /Users/mylogin/Music
$pics = File::HomeDir->my_pictures; # /Users/mylogin/Pictures
$videos = File::HomeDir->my_videos; # /Users/mylogin/Movies
$data = File::HomeDir->my_data; # /Users/mylogin/Library/Application Support
=head1 TODO
=over 4
=item * Test with Mac OS (versions 7, 8, 9)
=item * Some better way for users_* ?
=back
|