⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cwd.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
📖 第 1 页 / 共 2 页
字号:
## This is a faster version of getcwd.  It's also more dangerous because# you might chdir out of a directory that you can't chdir back into.    sub fastcwd_ {    my($odev, $oino, $cdev, $cino, $tdev, $tino);    my(@path, $path);    local(*DIR);    my($orig_cdev, $orig_cino) = stat('.');    ($cdev, $cino) = ($orig_cdev, $orig_cino);    for (;;) {	my $direntry;	($odev, $oino) = ($cdev, $cino);	CORE::chdir('..') || return undef;	($cdev, $cino) = stat('.');	last if $odev == $cdev && $oino == $cino;	opendir(DIR, '.') || return undef;	for (;;) {	    $direntry = readdir(DIR);	    last unless defined $direntry;	    next if $direntry eq '.';	    next if $direntry eq '..';	    ($tdev, $tino) = lstat($direntry);	    last unless $tdev != $odev || $tino != $oino;	}	closedir(DIR);	return undef unless defined $direntry; # should never happen	unshift(@path, $direntry);    }    $path = '/' . join('/', @path);    if ($^O eq 'apollo') { $path = "/".$path; }    # At this point $path may be tainted (if tainting) and chdir would fail.    # Untaint it then check that we landed where we started.    $path =~ /^(.*)\z/s		# untaint	&& CORE::chdir($1) or return undef;    ($cdev, $cino) = stat('.');    die "Unstable directory path, current directory changed unexpectedly"	if $cdev != $orig_cdev || $cino != $orig_cino;    $path;}if (not defined &fastcwd) { *fastcwd = \&fastcwd_ }# Keeps track of current working directory in PWD environment var# Usage:#	use Cwd 'chdir';#	chdir $newdir;my $chdir_init = 0;sub chdir_init {    if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') {	my($dd,$di) = stat('.');	my($pd,$pi) = stat($ENV{'PWD'});	if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {	    $ENV{'PWD'} = cwd();	}    }    else {	my $wd = cwd();	$wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32';	$ENV{'PWD'} = $wd;    }    # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar)    if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {	my($pd,$pi) = stat($2);	my($dd,$di) = stat($1);	if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {	    $ENV{'PWD'}="$2$3";	}    }    $chdir_init = 1;}sub chdir {    my $newdir = @_ ? shift : '';	# allow for no arg (chdir to HOME dir)    $newdir =~ s|///*|/|g unless $^O eq 'MSWin32';    chdir_init() unless $chdir_init;    my $newpwd;    if ($^O eq 'MSWin32') {	# get the full path name *before* the chdir()	$newpwd = Win32::GetFullPathName($newdir);    }    return 0 unless CORE::chdir $newdir;    if ($^O eq 'VMS') {	return $ENV{'PWD'} = $ENV{'DEFAULT'}    }    elsif ($^O eq 'MacOS') {	return $ENV{'PWD'} = cwd();    }    elsif ($^O eq 'MSWin32') {	$ENV{'PWD'} = $newpwd;	return 1;    }    if (ref $newdir eq 'GLOB') { # in case a file/dir handle is passed in	$ENV{'PWD'} = cwd();    } elsif ($newdir =~ m#^/#s) {	$ENV{'PWD'} = $newdir;    } else {	my @curdir = split(m#/#,$ENV{'PWD'});	@curdir = ('') unless @curdir;	my $component;	foreach $component (split(m#/#, $newdir)) {	    next if $component eq '.';	    pop(@curdir),next if $component eq '..';	    push(@curdir,$component);	}	$ENV{'PWD'} = join('/',@curdir) || '/';    }    1;}sub _perl_abs_path{    my $start = @_ ? shift : '.';    my($dotdots, $cwd, @pst, @cst, $dir, @tst);    unless (@cst = stat( $start ))    {	_carp("stat($start): $!");	return '';    }    unless (-d _) {        # Make sure we can be invoked on plain files, not just directories.        # NOTE that this routine assumes that '/' is the only directory separator.	        my ($dir, $file) = $start =~ m{^(.*)/(.+)$}	    or return cwd() . '/' . $start;		# Can't use "-l _" here, because the previous stat was a stat(), not an lstat().	if (-l $start) {	    my $link_target = readlink($start);	    die "Can't resolve link $start: $!" unless defined $link_target;	    	    require File::Spec;            $link_target = $dir . '/' . $link_target                unless File::Spec->file_name_is_absolute($link_target);	    	    return abs_path($link_target);	}		return $dir ? abs_path($dir) . "/$file" : "/$file";    }    $cwd = '';    $dotdots = $start;    do    {	$dotdots .= '/..';	@pst = @cst;	local *PARENT;	unless (opendir(PARENT, $dotdots))	{	    # probably a permissions issue.  Try the native command.	    return File::Spec->rel2abs( $start, _backtick_pwd() );	}	unless (@cst = stat($dotdots))	{	    _carp("stat($dotdots): $!");	    closedir(PARENT);	    return '';	}	if ($pst[0] == $cst[0] && $pst[1] == $cst[1])	{	    $dir = undef;	}	else	{	    do	    {		unless (defined ($dir = readdir(PARENT)))	        {		    _carp("readdir($dotdots): $!");		    closedir(PARENT);		    return '';		}		$tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir"))	    }	    while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] ||		   $tst[1] != $pst[1]);	}	$cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ;	closedir(PARENT);    } while (defined $dir);    chop($cwd) unless $cwd eq '/'; # drop the trailing /    $cwd;}my $Curdir;sub fast_abs_path {    local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage    my $cwd = getcwd();    require File::Spec;    my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir);    # Detaint else we'll explode in taint mode.  This is safe because    # we're not doing anything dangerous with it.    ($path) = $path =~ /(.*)/;    ($cwd)  = $cwd  =~ /(.*)/;    unless (-e $path) { 	_croak("$path: No such file or directory");    }    unless (-d _) {        # Make sure we can be invoked on plain files, not just directories.		my ($vol, $dir, $file) = File::Spec->splitpath($path);	return File::Spec->catfile($cwd, $path) unless length $dir;	if (-l $path) {	    my $link_target = readlink($path);	    die "Can't resolve link $path: $!" unless defined $link_target;	    	    $link_target = File::Spec->catpath($vol, $dir, $link_target)                unless File::Spec->file_name_is_absolute($link_target);	    	    return fast_abs_path($link_target);	}		return $dir eq File::Spec->rootdir	  ? File::Spec->catpath($vol, $dir, $file)	  : fast_abs_path(File::Spec->catpath($vol, $dir, '')) . '/' . $file;    }    if (!CORE::chdir($path)) { 	_croak("Cannot chdir to $path: $!");    }    my $realpath = getcwd();    if (! ((-d $cwd) && (CORE::chdir($cwd)))) { 	_croak("Cannot chdir back to $cwd: $!");    }    $realpath;}# added function alias to follow principle of least surprise# based on previous aliasing.  --tchrist 27-Jan-00*fast_realpath = \&fast_abs_path;# --- PORTING SECTION ---# VMS: $ENV{'DEFAULT'} points to default directory at all times# 06-Mar-1996  Charles Bailey  bailey@newman.upenn.edu# Note: Use of Cwd::chdir() causes the logical name PWD to be defined#   in the process logical name table as the default device and directory#   seen by Perl. This may not be the same as the default device#   and directory seen by DCL after Perl exits, since the effects#   the CRTL chdir() function persist only until Perl exits.sub _vms_cwd {    return $ENV{'DEFAULT'};}sub _vms_abs_path {    return $ENV{'DEFAULT'} unless @_;    my $path = shift;    if (-l $path) {        my $link_target = readlink($path);        die "Can't resolve link $path: $!" unless defined $link_target;	            return _vms_abs_path($link_target);    }    if (defined &VMS::Filespec::vms_realpath) {        my $path = $_[0];        if ($path =~ m#(?<=\^)/# ) {            # Unix format            return VMS::Filespec::vms_realpath($path);        }	# VMS format	my $new_path = VMS::Filespec::vms_realname($path); 	# Perl expects directories to be in directory format	$new_path = VMS::Filespec::pathify($new_path) if -d $path;	return $new_path;    }    # Fallback to older algorithm if correct ones are not    # available.    # may need to turn foo.dir into [.foo]    my $pathified = VMS::Filespec::pathify($path);    $path = $pathified if defined $pathified;	    return VMS::Filespec::rmsexpand($path);}sub _os2_cwd {    $ENV{'PWD'} = `cmd /c cd`;    chomp $ENV{'PWD'};    $ENV{'PWD'} =~ s:\\:/:g ;    return $ENV{'PWD'};}sub _win32_cwd {    if (defined &DynaLoader::boot_DynaLoader) {	$ENV{'PWD'} = Win32::GetCwd();    }    else { # miniperl	chomp($ENV{'PWD'} = `cd`);    }    $ENV{'PWD'} =~ s:\\:/:g ;    return $ENV{'PWD'};}*_NT_cwd = defined &Win32::GetCwd ? \&_win32_cwd : \&_os2_cwd;sub _dos_cwd {    if (!defined &Dos::GetCwd) {        $ENV{'PWD'} = `command /c cd`;        chomp $ENV{'PWD'};        $ENV{'PWD'} =~ s:\\:/:g ;    } else {        $ENV{'PWD'} = Dos::GetCwd();    }    return $ENV{'PWD'};}sub _qnx_cwd {	local $ENV{PATH} = '';	local $ENV{CDPATH} = '';	local $ENV{ENV} = '';    $ENV{'PWD'} = `/usr/bin/fullpath -t`;    chomp $ENV{'PWD'};    return $ENV{'PWD'};}sub _qnx_abs_path {	local $ENV{PATH} = '';	local $ENV{CDPATH} = '';	local $ENV{ENV} = '';    my $path = @_ ? shift : '.';    local *REALPATH;    defined( open(REALPATH, '-|') || exec '/usr/bin/fullpath', '-t', $path ) or      die "Can't open /usr/bin/fullpath: $!";    my $realpath = <REALPATH>;    close REALPATH;    chomp $realpath;    return $realpath;}sub _epoc_cwd {    $ENV{'PWD'} = EPOC::getcwd();    return $ENV{'PWD'};}# Now that all the base-level functions are set up, alias the# user-level functions to the right placesif (exists $METHOD_MAP{$^O}) {  my $map = $METHOD_MAP{$^O};  foreach my $name (keys %$map) {    local $^W = 0;  # assignments trigger 'subroutine redefined' warning    no strict 'refs';    *{$name} = \&{$map->{$name}};  }}# In case the XS version doesn't load.*abs_path = \&_perl_abs_path unless defined &abs_path;*getcwd = \&_perl_getcwd unless defined &getcwd;# added function alias for those of us more# used to the libc function.  --tchrist 27-Jan-00*realpath = \&abs_path;1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -