File: link.pl

package info (click to toggle)
debian-cd 2.2.13
  • links: PTS
  • area: main
  • in suites: woody
  • size: 1,480 kB
  • ctags: 120
  • sloc: sh: 1,666; perl: 1,078; makefile: 832
file content (62 lines) | stat: -rwxr-xr-x 1,310 bytes parent folder | download | duplicates (4)
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
#!/usr/bin/perl -w

use strict;

my $symlink_farm = $ENV{'SYMLINK'} || 0;
my $link_verbose = $ENV{'VERBOSE'} || 0;
my $link_copy = $ENV{'COPYLINK'} || 0;

sub good_link ($$) {
	my ($src, $dest) = @_;

	# Check if the destination directory does exist
	my $ddir = $dest;
	$ddir =~ s#/?[^/]+$##g;
	if ($ddir eq "") 
	{
		$ddir = ".";
	}
	if (! -d $ddir) # Create it if not
	{
		system("mkdir -p $ddir");
	}
	# Link the files
	if ($symlink_farm) {
		print "Symlink: $dest => $src\n" if ($link_verbose >= 3);
		if (not symlink ($src, $dest)) {
			print STDERR "Symlink from $src to $dest failed: $!\n";
		}
	} elsif ($link_copy) {
		print "Copy: $dest => $src\n" if ($link_verbose >= 3);
		if (system("cp -ap $src $dest")) {
			my $err_num = $? >> 8;
			my $sig_num = $? & 127;
			print STDERR "Copy from $src to $dest failed: cp exited with error code $err_num, signal $sig_num\n";
		}
	} else {
		print "Hardlink: $dest => $src\n" if ($link_verbose >= 3);
		if (not link ($src, $dest)) {
			print STDERR "Link from $src to $dest failed: $!\n";
		}
	}
}

sub real_file ($) {
	my $link = shift;
	my ($dir, $to);
	
	while (-l $link) {
		$dir = $link;
		$dir =~ s#[^/]+/?$##;
		if ($to = readlink($link)) {
			$link = $dir . $to;
		} else {
			print STDERR "Can't readlink $link: $!\n";
		}
	}

	return $link;
}


1;