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

📄 cmd.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
📖 第 1 页 / 共 2 页
字号:
# Net::Cmd.pm## Copyright (c) 1995-2006 Graham Barr <gbarr@pobox.com>. All rights reserved.# This program is free software; you can redistribute it and/or# modify it under the same terms as Perl itself.package Net::Cmd;require 5.001;require Exporter;use strict;use vars qw(@ISA @EXPORT $VERSION);use Carp;use Symbol 'gensym';BEGIN {  if ($^O eq 'os390') {    require Convert::EBCDIC;    #    Convert::EBCDIC->import;  }}BEGIN {  if (!eval { require utf8 }) {    *is_utf8 = sub { 0 };  }  elsif (eval { utf8::is_utf8(undef); 1 }) {    *is_utf8 = \&utf8::is_utf8;  }  elsif (eval { require Encode; Encode::is_utf8(undef); 1 }) {    *is_utf8 = \&Encode::is_utf8;  }  else {    *is_utf8 = sub { $_[0] =~ /[^\x00-\xff]/ };  }}$VERSION = "2.29";@ISA     = qw(Exporter);@EXPORT  = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING);sub CMD_INFO    {1}sub CMD_OK      {2}sub CMD_MORE    {3}sub CMD_REJECT  {4}sub CMD_ERROR   {5}sub CMD_PENDING {0}my %debug = ();my $tr = $^O eq 'os390' ? Convert::EBCDIC->new() : undef;sub toebcdic {  my $cmd = shift;  unless (exists ${*$cmd}{'net_cmd_asciipeer'}) {    my $string    = $_[0];    my $ebcdicstr = $tr->toebcdic($string);    ${*$cmd}{'net_cmd_asciipeer'} = $string !~ /^\d+/ && $ebcdicstr =~ /^\d+/;  }  ${*$cmd}{'net_cmd_asciipeer'}    ? $tr->toebcdic($_[0])    : $_[0];}sub toascii {  my $cmd = shift;  ${*$cmd}{'net_cmd_asciipeer'}    ? $tr->toascii($_[0])    : $_[0];}sub _print_isa {  no strict qw(refs);  my $pkg = shift;  my $cmd = $pkg;  $debug{$pkg} ||= 0;  my %done = ();  my @do   = ($pkg);  my %spc  = ($pkg, "");  while ($pkg = shift @do) {    next if defined $done{$pkg};    $done{$pkg} = 1;    my $v =      defined ${"${pkg}::VERSION"}      ? "(" . ${"${pkg}::VERSION"} . ")"      : "";    my $spc = $spc{$pkg};    $cmd->debug_print(1, "${spc}${pkg}${v}\n");    if (@{"${pkg}::ISA"}) {      @spc{@{"${pkg}::ISA"}} = ("  " . $spc{$pkg}) x @{"${pkg}::ISA"};      unshift(@do, @{"${pkg}::ISA"});    }  }}sub debug {  @_ == 1 or @_ == 2 or croak 'usage: $obj->debug([LEVEL])';  my ($cmd, $level) = @_;  my $pkg    = ref($cmd) || $cmd;  my $oldval = 0;  if (ref($cmd)) {    $oldval = ${*$cmd}{'net_cmd_debug'} || 0;  }  else {    $oldval = $debug{$pkg} || 0;  }  return $oldval    unless @_ == 2;  $level = $debug{$pkg} || 0    unless defined $level;  _print_isa($pkg)    if ($level && !exists $debug{$pkg});  if (ref($cmd)) {    ${*$cmd}{'net_cmd_debug'} = $level;  }  else {    $debug{$pkg} = $level;  }  $oldval;}sub message {  @_ == 1 or croak 'usage: $obj->message()';  my $cmd = shift;  wantarray    ? @{${*$cmd}{'net_cmd_resp'}}    : join("", @{${*$cmd}{'net_cmd_resp'}});}sub debug_text { $_[2] }sub debug_print {  my ($cmd, $out, $text) = @_;  print STDERR $cmd, ($out ? '>>> ' : '<<< '), $cmd->debug_text($out, $text);}sub code {  @_ == 1 or croak 'usage: $obj->code()';  my $cmd = shift;  ${*$cmd}{'net_cmd_code'} = "000"    unless exists ${*$cmd}{'net_cmd_code'};  ${*$cmd}{'net_cmd_code'};}sub status {  @_ == 1 or croak 'usage: $obj->status()';  my $cmd = shift;  substr(${*$cmd}{'net_cmd_code'}, 0, 1);}sub set_status {  @_ == 3 or croak 'usage: $obj->set_status(CODE, MESSAGE)';  my $cmd = shift;  my ($code, $resp) = @_;  $resp = [$resp]    unless ref($resp);  (${*$cmd}{'net_cmd_code'}, ${*$cmd}{'net_cmd_resp'}) = ($code, $resp);  1;}sub command {  my $cmd = shift;  unless (defined fileno($cmd)) {    $cmd->set_status("599", "Connection closed");    return $cmd;  }  $cmd->dataend()    if (exists ${*$cmd}{'net_cmd_last_ch'});  if (scalar(@_)) {    local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';    my $str = join(      " ",      map {        /\n/          ? do { my $n = $_; $n =~ tr/\n/ /; $n }          : $_;        } @_    );    $str = $cmd->toascii($str) if $tr;    $str .= "\015\012";    my $len = length $str;    my $swlen;    $cmd->close      unless (defined($swlen = syswrite($cmd, $str, $len)) && $swlen == $len);    $cmd->debug_print(1, $str)      if ($cmd->debug);    ${*$cmd}{'net_cmd_resp'} = [];       # the response    ${*$cmd}{'net_cmd_code'} = "000";    # Made this one up :-)  }  $cmd;}sub ok {  @_ == 1 or croak 'usage: $obj->ok()';  my $code = $_[0]->code;  0 < $code && $code < 400;}sub unsupported {  my $cmd = shift;  ${*$cmd}{'net_cmd_resp'} = ['Unsupported command'];  ${*$cmd}{'net_cmd_code'} = 580;  0;}sub getline {  my $cmd = shift;  ${*$cmd}{'net_cmd_lines'} ||= [];  return shift @{${*$cmd}{'net_cmd_lines'}}    if scalar(@{${*$cmd}{'net_cmd_lines'}});  my $partial = defined(${*$cmd}{'net_cmd_partial'}) ? ${*$cmd}{'net_cmd_partial'} : "";  my $fd      = fileno($cmd);  return undef    unless defined $fd;  my $rin = "";  vec($rin, $fd, 1) = 1;  my $buf;  until (scalar(@{${*$cmd}{'net_cmd_lines'}})) {    my $timeout = $cmd->timeout || undef;    my $rout;    my $select_ret = select($rout = $rin, undef, undef, $timeout);    if ($select_ret > 0) {      unless (sysread($cmd, $buf = "", 1024)) {        carp(ref($cmd) . ": Unexpected EOF on command channel")          if $cmd->debug;        $cmd->close;        return undef;      }      substr($buf, 0, 0) = $partial;    ## prepend from last sysread      my @buf = split(/\015?\012/, $buf, -1);    ## break into lines      $partial = pop @buf;      push(@{${*$cmd}{'net_cmd_lines'}}, map {"$_\n"} @buf);    }    else {      my $msg = $select_ret ? "Error or Interrupted: $!" : "Timeout";      carp("$cmd: $msg") if ($cmd->debug);      return undef;    }  }  ${*$cmd}{'net_cmd_partial'} = $partial;  if ($tr) {    foreach my $ln (@{${*$cmd}{'net_cmd_lines'}}) {      $ln = $cmd->toebcdic($ln);    }  }  shift @{${*$cmd}{'net_cmd_lines'}};}sub ungetline {  my ($cmd, $str) = @_;  ${*$cmd}{'net_cmd_lines'} ||= [];  unshift(@{${*$cmd}{'net_cmd_lines'}}, $str);}sub parse_response {  return ()    unless $_[1] =~ s/^(\d\d\d)(.?)//o;  ($1, $2 eq "-");}sub response {  my $cmd = shift;  my ($code, $more) = (undef) x 2;  ${*$cmd}{'net_cmd_resp'} ||= [];  while (1) {    my $str = $cmd->getline();    return CMD_ERROR      unless defined($str);    $cmd->debug_print(0, $str)      if ($cmd->debug);    ($code, $more) = $cmd->parse_response($str);    unless (defined $code) {      $cmd->ungetline($str);      last;    }    ${*$cmd}{'net_cmd_code'} = $code;    push(@{${*$cmd}{'net_cmd_resp'}}, $str);    last unless ($more);  }  substr($code, 0, 1);}sub read_until_dot {  my $cmd = shift;  my $fh  = shift;  my $arr = [];  while (1) {    my $str = $cmd->getline() or return undef;    $cmd->debug_print(0, $str)      if ($cmd->debug & 4);    last if ($str =~ /^\.\r?\n/o);    $str =~ s/^\.\././o;    if (defined $fh) {      print $fh $str;    }    else {      push(@$arr, $str);    }  }

⌨️ 快捷键说明

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