Commit | Line | Data |
---|---|---|
9e6fc21f NC |
1 | #!perl |
2 | ||
3 | # Initialisation code and subroutines shared between installperl and installman | |
4 | # Probably installhtml needs to join the club. | |
5 | ||
6 | use strict; | |
de35015f | 7 | use vars qw($Is_VMS $Is_W32 $Is_OS2 $Is_Cygwin $Is_Darwin $Is_NetWare $Is_AmigaOS |
9e6fc21f NC |
8 | %opts $packlist); |
9 | use subs qw(unlink link chmod); | |
a01f5661 | 10 | require File::Path; |
b3387df1 | 11 | require File::Copy; |
9e6fc21f | 12 | |
9e6fc21f | 13 | BEGIN { |
f4df373d NC |
14 | require Config; |
15 | if ($Config::Config{userelocatableinc}) { | |
9e6fc21f NC |
16 | # This might be a considered a hack. Need to get information about the |
17 | # configuration from Config.pm *before* Config.pm expands any .../ | |
18 | # prefixes. | |
19 | # | |
20 | # So we set $^X to pretend that we're the already installed perl, so | |
2effe01f | 21 | # Config.pm does its ... expansion off that location. |
9e6fc21f | 22 | |
f4df373d | 23 | my $location = $Config::Config{initialinstalllocation}; |
9e6fc21f NC |
24 | die <<'OS' unless defined $location; |
25 | $Config{initialinstalllocation} is not defined - can't install a relocatable | |
26 | perl without this. | |
27 | OS | |
28 | $^X = "$location/perl"; | |
29 | # And then remove all trace of ever having loaded Config.pm, so that | |
30 | # it will reload with the revised $^X | |
31 | undef %Config::; | |
32 | delete $INC{"Config.pm"}; | |
33 | delete $INC{"Config_heavy.pl"}; | |
46807d8e | 34 | delete $INC{"Config_git.pl"}; |
9e6fc21f NC |
35 | # You never saw us. We weren't here. |
36 | ||
37 | require Config; | |
9e6fc21f | 38 | } |
f4df373d | 39 | Config->import; |
9e6fc21f NC |
40 | } |
41 | ||
42 | if ($Config{d_umask}) { | |
43 | umask(022); # umasks like 077 aren't that useful for installations | |
44 | } | |
45 | ||
46 | $Is_VMS = $^O eq 'VMS'; | |
47 | $Is_W32 = $^O eq 'MSWin32'; | |
48 | $Is_OS2 = $^O eq 'os2'; | |
49 | $Is_Cygwin = $^O eq 'cygwin'; | |
50 | $Is_Darwin = $^O eq 'darwin'; | |
51 | $Is_NetWare = $Config{osname} eq 'NetWare'; | |
de35015f | 52 | $Is_AmigaOS = $^O eq 'amigaos'; |
9e6fc21f NC |
53 | |
54 | sub unlink { | |
55 | my(@names) = @_; | |
56 | my($cnt) = 0; | |
57 | ||
58 | return scalar(@names) if $Is_VMS; | |
59 | ||
60 | foreach my $name (@names) { | |
61 | next unless -e $name; | |
de35015f | 62 | chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_Cygwin || $Is_NetWare || $Is_AmigaOS); |
9e6fc21f NC |
63 | print " unlink $name\n" if $opts{verbose}; |
64 | ( CORE::unlink($name) and ++$cnt | |
65 | or warn "Couldn't unlink $name: $!\n" ) unless $opts{notify}; | |
66 | } | |
67 | return $cnt; | |
68 | } | |
69 | ||
70 | sub link { | |
71 | my($from,$to) = @_; | |
72 | my($success) = 0; | |
73 | ||
74 | my $xfrom = $from; | |
75 | $xfrom =~ s/^\Q$opts{destdir}\E// if $opts{destdir}; | |
76 | my $xto = $to; | |
77 | $xto =~ s/^\Q$opts{destdir}\E// if $opts{destdir}; | |
78 | print $opts{verbose} ? " ln $xfrom $xto\n" : " $xto\n" | |
79 | unless $opts{silent}; | |
de35015f | 80 | my $link = $Is_AmigaOS ? \&CORE::symlink : \&CORE::link; |
9e6fc21f | 81 | eval { |
de35015f AB |
82 | $link->($from, $to) |
83 | ? $success++ | |
84 | : ($from =~ m#^/afs/# || $to =~ m#^/afs/#) | |
85 | ? die "AFS" # okay inside eval {} | |
86 | : die "Couldn't link $from to $to: $!\n" | |
87 | unless $opts{notify}; | |
88 | $packlist->{$xto} = { from => $xfrom, type => 'link' }; | |
89 | }; | |
9e6fc21f NC |
90 | if ($@) { |
91 | warn "Replacing link() with File::Copy::copy(): $@"; | |
92 | print $opts{verbose} ? " cp $from $xto\n" : " $xto\n" | |
93 | unless $opts{silent}; | |
94 | print " creating new version of $xto\n" | |
95 | if $Is_VMS and -e $to and !$opts{silent}; | |
96 | unless ($opts{notify} or File::Copy::copy($from, $to) and ++$success) { | |
97 | # Might have been that F::C::c can't overwrite the target | |
98 | warn "Couldn't copy $from to $to: $!\n" | |
99 | unless -f $to and (chmod(0666, $to), unlink $to) | |
100 | and File::Copy::copy($from, $to) and ++$success; | |
101 | } | |
102 | $packlist->{$xto} = { type => 'file' }; | |
103 | } | |
104 | $success; | |
105 | } | |
106 | ||
107 | sub chmod { | |
108 | my($mode,$name) = @_; | |
109 | ||
110 | return if ($^O eq 'dos'); | |
111 | printf " chmod %o %s\n", $mode, $name if $opts{verbose}; | |
112 | CORE::chmod($mode,$name) | |
113 | || warn sprintf("Couldn't chmod %o %s: $!\n", $mode, $name) | |
114 | unless $opts{notify}; | |
115 | } | |
116 | ||
9e6fc21f NC |
117 | sub samepath { |
118 | my($p1, $p2) = @_; | |
119 | ||
120 | return (lc($p1) eq lc($p2)) if ($Is_W32 || $Is_NetWare); | |
121 | ||
06647572 NC |
122 | return 1 |
123 | if $p1 eq $p2; | |
124 | ||
125 | my ($dev1, $ino1) = stat $p1; | |
126 | return 0 | |
127 | unless defined $dev1; | |
128 | my ($dev2, $ino2) = stat $p2; | |
129 | ||
130 | return $dev1 == $dev2 && $ino1 == $ino2; | |
9e6fc21f NC |
131 | } |
132 | ||
4c432614 NC |
133 | sub safe_rename { |
134 | my($from,$to) = @_; | |
135 | if (-f $to and not unlink($to)) { | |
136 | my($i); | |
137 | for ($i = 1; $i < 50; $i++) { | |
138 | last if rename($to, "$to.$i"); | |
139 | } | |
140 | warn("Cannot rename to '$to.$i': $!"), return 0 | |
141 | if $i >= 50; # Give up! | |
142 | } | |
143 | link($from,$to) || return 0; | |
144 | unlink($from); | |
145 | } | |
146 | ||
a01f5661 NC |
147 | sub mkpath { |
148 | File::Path::mkpath(shift , $opts{verbose}, 0777) unless $opts{notify}; | |
149 | } | |
150 | ||
de35015f AB |
151 | sub unixtoamiga |
152 | { | |
153 | my $unixpath = shift; | |
154 | ||
155 | my @parts = split("/",$unixpath); | |
156 | my $isdir = 0; | |
157 | $isdir = 1 if substr($unixpath,-1) eq "/"; | |
158 | ||
159 | my $first = 1; | |
160 | my $amigapath = ""; | |
161 | ||
162 | my $i = 0; | |
163 | ||
164 | for($i = 0; $i <= $#parts;$i++) | |
165 | { | |
166 | next if $parts[$i] eq "."; | |
167 | if($parts[$i] eq "..") | |
168 | { | |
169 | $parts[$i] = "/"; | |
170 | } | |
171 | if($i == 0) | |
172 | { | |
173 | if($parts[$i] eq "") | |
174 | { | |
175 | $amigapath .= $parts[$i + 1] . ":"; | |
176 | $i++; | |
177 | next; | |
178 | } | |
179 | } | |
180 | $amigapath .= $parts[$i]; | |
181 | if($i != $#parts) | |
182 | { | |
183 | $amigapath .= "/" unless $parts[$i] eq "/" ; | |
184 | } | |
185 | else | |
186 | { | |
187 | if($isdir) | |
188 | { | |
189 | $amigapath .= "/" unless $parts[$i] eq "/" ; | |
190 | } | |
191 | } | |
192 | } | |
193 | ||
194 | return $amigapath; | |
195 | } | |
196 | ||
197 | sub amigaprotect | |
198 | { | |
199 | my ($file,$bits) = @_; | |
200 | print "PROTECT: File $file\n"; | |
201 | system("PROTECT $file $bits") | |
202 | unless $opts{notify}; | |
203 | } | |
204 | ||
9e6fc21f | 205 | 1; |