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

📄 temp.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
📖 第 1 页 / 共 5 页
字号:
  }  # Check that the parent directories exist  # Do this even for the case where we are simply returning a name  # not a file -- no point returning a name that includes a directory  # that does not exist or is not writable  unless (-e $parent) {    ${$options{ErrStr}} = "Parent directory ($parent) does not exist";    return ();  }  unless (-d $parent) {    ${$options{ErrStr}} = "Parent directory ($parent) is not a directory";    return ();  }  unless (-w $parent) {    ${$options{ErrStr}} = "Parent directory ($parent) is not writable\n";      return ();  }  # Check the stickiness of the directory and chown giveaway if required  # If the directory is world writable the sticky bit  # must be set  if (File::Temp->safe_level == MEDIUM) {    my $safeerr;    unless (_is_safe($parent,\$safeerr)) {      ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)";      return ();    }  } elsif (File::Temp->safe_level == HIGH) {    my $safeerr;    unless (_is_verysafe($parent, \$safeerr)) {      ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)";      return ();    }  }  # Now try MAX_TRIES time to open the file  for (my $i = 0; $i < MAX_TRIES; $i++) {    # Try to open the file if requested    if ($options{"open"}) {      my $fh;      # If we are running before perl5.6.0 we can not auto-vivify      if ($] < 5.006) {	$fh = &Symbol::gensym;      }      # Try to make sure this will be marked close-on-exec      # XXX: Win32 doesn't respect this, nor the proper fcntl,      #      but may have O_NOINHERIT. This may or may not be in Fcntl.      local $^F = 2;      # Attempt to open the file      my $open_success = undef;      if ( $^O eq 'VMS' and $options{"unlink_on_close"} && !$KEEP_ALL) {        # make it auto delete on close by setting FAB$V_DLT bit	$fh = VMS::Stdio::vmssysopen($path, $OPENFLAGS, 0600, 'fop=dlt');	$open_success = $fh;      } else {	my $flags = ( ($options{"unlink_on_close"} && !$KEEP_ALL) ?		      $OPENTEMPFLAGS :		      $OPENFLAGS );	$flags |= $LOCKFLAG if (defined $LOCKFLAG && $options{use_exlock});	$open_success = sysopen($fh, $path, $flags, 0600);      }      if ( $open_success ) {	# in case of odd umask force rw	chmod(0600, $path);	# Opened successfully - return file handle and name	return ($fh, $path);      } else {	# Error opening file - abort with error	# if the reason was anything but EEXIST	unless ($!{EEXIST}) {	  ${$options{ErrStr}} = "Could not create temp file $path: $!";	  return ();	}	# Loop round for another try      }    } elsif ($options{"mkdir"}) {      # Open the temp directory      if (mkdir( $path, 0700)) {	# in case of odd umask	chmod(0700, $path);	return undef, $path;      } else {	# Abort with error if the reason for failure was anything	# except EEXIST	unless ($!{EEXIST}) {	  ${$options{ErrStr}} = "Could not create directory $path: $!";	  return ();	}	# Loop round for another try      }    } else {      # Return true if the file can not be found      # Directory has been checked previously      return (undef, $path) unless -e $path;      # Try again until MAX_TRIES    }    # Did not successfully open the tempfile/dir    # so try again with a different set of random letters    # No point in trying to increment unless we have only    # 1 X say and the randomness could come up with the same    # file MAX_TRIES in a row.    # Store current attempt - in principal this implies that the    # 3rd time around the open attempt that the first temp file    # name could be generated again. Probably should store each    # attempt and make sure that none are repeated    my $original = $path;    my $counter = 0;  # Stop infinite loop    my $MAX_GUESS = 50;    do {      # Generate new name from original template      $path = _replace_XX($template, $options{"suffixlen"});      $counter++;    } until ($path ne $original || $counter > $MAX_GUESS);    # Check for out of control looping    if ($counter > $MAX_GUESS) {      ${$options{ErrStr}} = "Tried to get a new temp name different to the previous value $MAX_GUESS times.\nSomething wrong with template?? ($template)";      return ();    }  }  # If we get here, we have run out of tries  ${ $options{ErrStr} } = "Have exceeded the maximum number of attempts ("    . MAX_TRIES . ") to open temp file/dir";  return ();}# Internal routine to replace the XXXX... with random characters# This has to be done by _gettemp() every time it fails to# open a temp file/dir# Arguments:  $template (the template with XXX),#             $ignore   (number of characters at end to ignore)# Returns:    modified templatesub _replace_XX {  croak 'Usage: _replace_XX($template, $ignore)'    unless scalar(@_) == 2;  my ($path, $ignore) = @_;  # Do it as an if, since the suffix adjusts which section to replace  # and suffixlen=0 returns nothing if used in the substr directly  # Alternatively, could simply set $ignore to length($path)-1  # Don't want to always use substr when not required though.  my $end = ( $] >= 5.006 ? "\\z" : "\\Z" );  if ($ignore) {    substr($path, 0, - $ignore) =~ s/X(?=X*$end)/$CHARS[ int( rand( @CHARS ) ) ]/ge;  } else {    $path =~ s/X(?=X*$end)/$CHARS[ int( rand( @CHARS ) ) ]/ge;  }  return $path;}# Internal routine to force a temp file to be writable after# it is created so that we can unlink it. Windows seems to occassionally# force a file to be readonly when written to certain temp locationssub _force_writable {  my $file = shift;  chmod 0600, $file;}# internal routine to check to see if the directory is safe# First checks to see if the directory is not owned by the# current user or root. Then checks to see if anyone else# can write to the directory and if so, checks to see if# it has the sticky bit set# Will not work on systems that do not support sticky bit#Args:  directory path to check#       Optionally: reference to scalar to contain error message# Returns true if the path is safe and false otherwise.# Returns undef if can not even run stat() on the path# This routine based on version written by Tom Christiansen# Presumably, by the time we actually attempt to create the# file or directory in this directory, it may not be safe# anymore... Have to run _is_safe directly after the open.sub _is_safe {  my $path = shift;  my $err_ref = shift;  # Stat path  my @info = stat($path);  unless (scalar(@info)) {    $$err_ref = "stat(path) returned no values";    return 0;  };  return 1 if $^O eq 'VMS';  # owner delete control at file level  # Check to see whether owner is neither superuser (or a system uid) nor me  # Use the effective uid from the $> variable  # UID is in [4]  if ($info[4] > File::Temp->top_system_uid() && $info[4] != $>) {    Carp::cluck(sprintf "uid=$info[4] topuid=%s euid=$> path='$path'",		File::Temp->top_system_uid());    $$err_ref = "Directory owned neither by root nor the current user"      if ref($err_ref);    return 0;  }  # check whether group or other can write file  # use 066 to detect either reading or writing  # use 022 to check writability  # Do it with S_IWOTH and S_IWGRP for portability (maybe)  # mode is in info[2]  if (($info[2] & &Fcntl::S_IWGRP) ||   # Is group writable?      ($info[2] & &Fcntl::S_IWOTH) ) {  # Is world writable?    # Must be a directory    unless (-d $path) {      $$err_ref = "Path ($path) is not a directory"      if ref($err_ref);      return 0;    }    # Must have sticky bit set    unless (-k $path) {      $$err_ref = "Sticky bit not set on $path when dir is group|world writable"	if ref($err_ref);      return 0;    }  }  return 1;}# Internal routine to check whether a directory is safe# for temp files. Safer than _is_safe since it checks for# the possibility of chown giveaway and if that is a possibility# checks each directory in the path to see if it is safe (with _is_safe)# If _PC_CHOWN_RESTRICTED is not set, does the full test of each# directory anyway.# Takes optional second arg as scalar ref to error reasonsub _is_verysafe {  # Need POSIX - but only want to bother if really necessary due to overhead  require POSIX;  my $path = shift;  print "_is_verysafe testing $path\n" if $DEBUG;  return 1 if $^O eq 'VMS';  # owner delete control at file level  my $err_ref = shift;  # Should Get the value of _PC_CHOWN_RESTRICTED if it is defined  # and If it is not there do the extensive test  local($@);  my $chown_restricted;  $chown_restricted = &POSIX::_PC_CHOWN_RESTRICTED()    if eval { &POSIX::_PC_CHOWN_RESTRICTED(); 1};  # If chown_resticted is set to some value we should test it  if (defined $chown_restricted) {    # Return if the current directory is safe    return _is_safe($path,$err_ref) if POSIX::sysconf( $chown_restricted );  }  # To reach this point either, the _PC_CHOWN_RESTRICTED symbol  # was not avialable or the symbol was there but chown giveaway  # is allowed. Either way, we now have to test the entire tree for  # safety.  # Convert path to an absolute directory if required  unless (File::Spec->file_name_is_absolute($path)) {    $path = File::Spec->rel2abs($path);  }  # Split directory into components - assume no file  my ($volume, $directories, undef) = File::Spec->splitpath( $path, 1);  # Slightly less efficient than having a function in File::Spec  # to chop off the end of a directory or even a function that  # can handle ../ in a directory tree  # Sometimes splitdir() returns a blank at the end  # so we will probably check the bottom directory twice in some cases  my @dirs = File::Spec->splitdir($directories);  # Concatenate one less directory each time around  foreach my $pos (0.. $#dirs) {    # Get a directory name    my $dir = File::Spec->catpath($volume,				  File::Spec->catdir(@dirs[0.. $#dirs - $pos]),				  ''				  );    print "TESTING DIR $dir\n" if $DEBUG;    # Check the directory    return 0 unless _is_safe($dir,$err_ref);  }  return 1;}# internal routine to determine whether unlink works on this# platform for files that are currently open.# Returns true if we can, false otherwise.# Currently WinNT, OS/2 and VMS can not unlink an opened file# On VMS this is because the O_EXCL flag is used to open the# temporary file. Currently I do not know enough about the issues# on VMS to decide whether O_EXCL is a requirement.sub _can_unlink_opened_file {  if ($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'VMS' || $^O eq 'dos' || $^O eq 'MacOS') {    return 0;  } else {    return 1;  }}# internal routine to decide which security levels are allowed# see safe_level() for more information on this# Controls whether the supplied security level is allowed#   $cando = _can_do_level( $level )sub _can_do_level {  # Get security level  my $level = shift;  # Always have to be able to do STANDARD  return 1 if $level == STANDARD;  # Currently, the systems that can do HIGH or MEDIUM are identical  if ( $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'cygwin' || $^O eq 'dos' || $^O eq 'MacOS' || $^O eq 'mpeix') {    return 0;  } else {    return 1;  }}# This routine sets up a deferred unlinking of a specified# filename and filehandle. It is used in the following cases:#  - Called by unlink0 if an opened file can not be unlinked#  - Called by tempfile() if files are to be removed on shutdown#  - Called by tempdir() if directories are to be removed on shutdown# Arguments:#   _deferred_unlink( $fh, $fname, $isdir );##   - filehandle (so that it can be expclicitly closed if open#   - filename   (the thing we want to remove)#   - isdir      (flag to indicate that we are being given a directory)#                 [and hence no filehandle]# Status is not referred to since all the magic is done with an END block{  # Will set up two lexical variables to contain all the files to be  # removed. One array for files, another for directories They will  # only exist in this block.  #  This means we only have to set up a single END block to remove  #  all files.   # in order to prevent child processes inadvertently deleting the parent  # temp files we use a hash to store the temp files and directories  # created by a particular process id.  # %files_to_unlink contains values that are references to an array of  # array references containing the filehandle and filename associated with  # the temp file.  my (%files_to_unlink, %dirs_to_unlink);  # Set up an end block to use these arrays  END {    cleanup();  }  # Cleanup function. Always triggered on END but can be invoked  # manually.  sub cleanup {    if (!$KEEP_ALL) {      # Files      my @files = (exists $files_to_unlink{$$} ?		   @{ $files_to_unlink{$$} } : () );      foreach my $file (@files) {	# close the filehandle without checking its state	# in order to make real sure that this is closed	# if its already closed then I dont care about the answer	# probably a better way to do this	close($file->[0]);  # file handle is [0]	if (-f $file->[1]) {  # file name is [1]	  _force_writable( $file->[1] ); # for windows	  unlink $file->[1] or warn "Error removing ".$file->[1];	}      }      # Dirs

⌨️ 快捷键说明

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