mtr_misc.pl

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PL 代码 · 共 291 行

PL
291
字号
# -*- cperl -*-# Copyright (C) 2004-2006 MySQL AB# # This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; version 2 of the License.# # This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.# # You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA# This is a library file used by the Perl version of mysql-test-run,# and is part of the translation of the Bourne shell script with the# same name.use strict;use File::Find;sub mtr_native_path($);sub mtr_init_args ($);sub mtr_add_arg ($$@);sub mtr_path_exists(@);sub mtr_script_exists(@);sub mtr_file_exists(@);sub mtr_exe_exists(@);sub mtr_exe_maybe_exists(@);sub mtr_copy_dir($$);sub mtr_rmtree($);sub mtr_same_opts($$);sub mtr_cmp_opts($$);################################################################################  Misc################################################################################ Convert path to OS native formatsub mtr_native_path($){  my $path= shift;  # MySQL version before 5.0 still use cygwin, no need  # to convert path  return $path    if ($::mysql_version_id < 50000);  $path=~ s/\//\\/g    if ($::glob_win32);  return $path;}# FIXME move to own libsub mtr_init_args ($) {  my $args = shift;  $$args = [];                            # Empty list}sub mtr_add_arg ($$@) {  my $args=   shift;  my $format= shift;  my @fargs = @_;  push(@$args, sprintf($format, @fargs));}################################################################################ NOTE! More specific paths should be given before less specific.# For example /client/debug should be listed before /client#sub mtr_path_exists (@) {  foreach my $path ( @_ )  {    return $path if -e $path;  }  if ( @_ == 1 )  {    mtr_error("Could not find $_[0]");  }  else  {    mtr_error("Could not find any of " . join(" ", @_));  }}## NOTE! More specific paths should be given before less specific.# For example /client/debug should be listed before /client#sub mtr_script_exists (@) {  foreach my $path ( @_ )  {    if($::glob_win32)    {      return $path if -f $path;    }    else    {      return $path if -x $path;    }  }  if ( @_ == 1 )  {    mtr_error("Could not find $_[0]");  }  else  {    mtr_error("Could not find any of " . join(" ", @_));  }}## NOTE! More specific paths should be given before less specific.# For example /client/debug should be listed before /client#sub mtr_file_exists (@) {  foreach my $path ( @_ )  {    return $path if -e $path;  }  return "";}## NOTE! More specific paths should be given before less specific.# For example /client/debug should be listed before /client#sub mtr_exe_maybe_exists (@) {  my @path= @_;  map {$_.= ".exe"} @path if $::glob_win32;  map {$_.= ".nlm"} @path if $::glob_netware;  foreach my $path ( @path )  {    if($::glob_win32)    {      return $path if -f $path;    }    else    {      return $path if -x $path;    }  }  return "";}## NOTE! More specific paths should be given before less specific.# For example /client/debug should be listed before /client#sub mtr_exe_exists (@) {  my @path= @_;  if (my $path= mtr_exe_maybe_exists(@path))  {    return $path;  }  # Could not find exe, show error  if ( @path == 1 )  {    mtr_error("Could not find $path[0]");  }  else  {    mtr_error("Could not find any of " . join(" ", @path));  }}sub mtr_copy_dir($$) {  my $from_dir= shift;  my $to_dir= shift;  # mtr_verbose("Copying from $from_dir to $to_dir");  mkpath("$to_dir");  opendir(DIR, "$from_dir")    or mtr_error("Can't find $from_dir$!");  for(readdir(DIR)) {    next if "$_" eq "." or "$_" eq "..";    if ( -d "$from_dir/$_" )    {      mtr_copy_dir("$from_dir/$_", "$to_dir/$_");      next;    }    copy("$from_dir/$_", "$to_dir/$_");  }  closedir(DIR);}sub mtr_rmtree($) {  my ($dir)= @_;  my $need_file_find= 0;  mtr_verbose("mtr_rmtree: $dir");  {    # Try to use File::Path::rmtree. Recent versions    # handles removal of directories and files that don't    # have full permissions, while older versions    # may have a problem with that and we use our own version    local $SIG{__WARN__}= sub {      $need_file_find= 1;      mtr_warning($_[0]);    };    rmtree($dir);  }  if ( $need_file_find ) {    mtr_warning("rmtree($dir) failed, trying with File::Find...");    my $errors= 0;    # chmod    find( {	   no_chdir => 1,	   wanted => sub {	     chmod(0777, $_)	       or mtr_warning("couldn't chmod(0777, $_): $!") and $errors++;	   }	  },	  $dir	);    # rm    finddepth( {	   no_chdir => 1,	   wanted => sub {	     my $file= $_;	     # Use special underscore (_) filehandle, caches stat info	     if (!-l $file and -d _ ) {	       rmdir($file) or		 mtr_warning("couldn't rmdir($file): $!") and $errors++;	     } else {	       unlink($file)		 or mtr_warning("couldn't unlink($file): $!") and $errors++;	     }	   }	  },	  $dir	);    mtr_error("Failed to remove '$dir'") if $errors;    mtr_report("OK, that worked!");  }}sub mtr_same_opts ($$) {  my $l1= shift;  my $l2= shift;  return mtr_cmp_opts($l1,$l2) == 0;}sub mtr_cmp_opts ($$) {  my $l1= shift;  my $l2= shift;  my @l1= @$l1;  my @l2= @$l2;  return -1 if @l1 < @l2;  return  1 if @l1 > @l2;  while ( @l1 )                         # Same length  {    my $e1= shift @l1;    my $e2= shift @l2;    my $cmp= ($e1 cmp $e2);    return $cmp if $cmp != 0;  }  return 0;                             # They are the same}1;

⌨️ 快捷键说明

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