summaryrefslogtreecommitdiff
path: root/perl/OID/OID.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl/OID/OID.pm')
-rw-r--r--perl/OID/OID.pm256
1 files changed, 256 insertions, 0 deletions
diff --git a/perl/OID/OID.pm b/perl/OID/OID.pm
new file mode 100644
index 0000000..fa6b162
--- /dev/null
+++ b/perl/OID/OID.pm
@@ -0,0 +1,256 @@
+package NetSNMP::OID;
+
+use strict;
+use warnings;
+use Carp;
+
+require Exporter;
+require DynaLoader;
+use AutoLoader;
+
+sub compare($$);
+
+use overload
+ '<=>' => \&compare,
+ 'cmp' => \&oidstrcmp,
+ '""' => \&quote_oid,
+ '+' => \&add,
+;
+
+use SNMP;
+
+sub quote_oid {
+ return $_[0]->{'oidptr'}->to_string();
+}
+
+sub length {
+ return $_[0]->{'oidptr'}->length();
+}
+
+sub get_indexes {
+ return $_[0]->{'oidptr'}->get_indexes();
+}
+
+sub append {
+ my $this = shift;
+ my $str = shift;
+
+ if (ref($str) eq 'NetSNMP::OID') {
+ return $this->{'oidptr'}->append_oid($str->{'oidptr'});
+ }
+ $str = "." . $str if ($str =~ /^\d+/);
+ if ($str =~ /^[.\d]+/) {
+ # oid segment
+ return $this->{'oidptr'}->append($str);
+ }
+ if ($str =~ /^\"(.*)\"$/) {
+ # string index
+ my $newstr = "." . CORE::length($1);
+ map { $newstr .= ".$_" } unpack("c*",$1);
+ return $this->{'oidptr'}->append($newstr);
+ }
+ if ($str =~ /^\'(.*)\'$/) {
+ # string index, implied
+ my $newstr;
+ map { $newstr .= ".$_" } unpack("c*",$1);
+ return $this->{'oidptr'}->append($newstr);
+ }
+ # Just Parse it...
+ return $this->{'oidptr'}->append($str);
+}
+
+sub add {
+ my $this = shift;
+ my $str = shift;
+ my ($newoid, %newhash);
+ $newoid = \%newhash;
+ $newoid->{'oidptr'} = $this->{'oidptr'}->clone();
+ bless($newoid, ref($this));
+ $newoid->append($str);
+ return $newoid;
+}
+
+use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK @EXPORT $VERSION $AUTOLOAD);
+
+@ISA = qw(Exporter DynaLoader);
+
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+
+# This allows declaration use NetSNMP::OID ':all';
+# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
+# will save memory.
+%EXPORT_TAGS = ( 'all' => [ qw(
+ snmp_oid_compare
+ compare
+) ] );
+
+@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+@EXPORT = qw(
+ snmp_oid_compare
+ compare
+);
+$VERSION = '5.0702';
+
+sub new {
+ my $type = shift;
+ my $arg = shift;
+ if (!$arg) {
+ $arg = $type;
+ $type = "NetSNMP::OID";
+ }
+ SNMP::init_snmp("perl");
+ my $ptr = NetSNMP::OID::newptr($arg);
+ if ($ptr) {
+ return newwithptr($type, $ptr);
+ }
+}
+
+sub newwithptr {
+ my $type = shift;
+ my $ptr = shift;
+ my $self = {};
+ if (!$ptr) {
+ $ptr = $type;
+ $type = "NetSNMP::OID";
+ }
+ SNMP::init_snmp("perl");
+ $self->{'oidptr'} = $ptr;
+ bless($self, $type);
+ return $self;
+}
+
+sub snmp_oid_compare($$) {
+ my ($oid1, $oid2) = @_;
+ return _snmp_oid_compare($oid1->{oidptr}, $oid2->{oidptr});
+}
+
+sub compare($$) {
+ my ($v1, $v2) = @_;
+ snmp_oid_compare($v1, $v2);
+}
+
+sub oidstrcmp {
+ my ($v1, $v2) = @_;
+ $v1->{'oidptr'}->to_string cmp $v2->{'oidptr'}->to_string;
+}
+
+sub to_array($) {
+ my $self = shift;
+ return $self->{oidptr}->to_array();
+}
+
+sub DESTROY {}
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
+
+ my $constname;
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ croak "& not defined" if $constname eq 'constant';
+ my $val;
+ ($!, $val) = constant($constname);
+ if ($! != 0) {
+ if ($! =~ /Invalid/ || $!{EINVAL}) {
+ $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ goto &AutoLoader::AUTOLOAD;
+ }
+ else {
+ croak "Your vendor has not defined NetSNMP::OID macro $constname";
+ }
+ }
+ {
+ no strict 'refs';
+ # Fixed between 5.005_53 and 5.005_61
+ if ($] >= 5.00561) {
+ *$AUTOLOAD = sub () { $val };
+ }
+ else {
+ *$AUTOLOAD = sub { $val };
+ }
+ }
+ goto &$AUTOLOAD;
+}
+
+bootstrap NetSNMP::OID $VERSION;
+
+# Preloaded methods go here.
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+1;
+__END__
+
+=head1 NAME
+
+NetSNMP::OID - Perl extension for manipulating OIDs
+
+=head1 SYNOPSIS
+
+ use NetSNMP::OID;
+
+ my $oid = new NetSNMP::OID('sysContact.0');
+
+ if ($oid < new NetSNMP::OID('ifTable')) {
+ do_something();
+ }
+
+ my @numarray = $oid->to_array();
+
+ # appending oids
+ $oid = new NetSNMP::OID('.1.3');
+ $oid += ".6.1";
+ # -> .1.3.6.1
+
+ # appending index strings
+
+ $oid2 = $oid + "\"wes\"";
+ # -> .1.3.6.1.3.119.101.115
+
+ $oid3 = $oid + "\'wes\'";
+ # -> .1.3.6.1.119.101.115
+
+ $len = $oid3->length();
+ # -> 7
+
+ # retrieving indexes from an oid:
+ $arrayref = $tableoid->get_indexes()
+
+=head1 DESCRIPTION
+
+The NetSNMP::OID module is a simple wrapper around a C-based net-snmp
+oid (which is an array of unsigned integers). The OID is internally
+stored as a C array of integers for speed purposes when doing
+comparisons, etc.
+
+The standard logical expression operators (<, >, ==, ...) are
+overloaded such that lexographical comparisons may be done with them.
+
+The + operator is overloaded to allow you to append stuff on to the
+end of a OID, like index segments of a table, for example.
+
+=head2 EXPORT
+
+int snmp_oid_compare(oid1, oid2)
+int compare(oid1, oid2)
+
+=head1 AUTHOR
+
+Wes Hardaker, E<lt>hardaker@users.sourceforge.netE<gt>
+
+=head1 SEE ALSO
+
+L<SNMP>, L<perl>.
+
+=head1 Copyright
+
+Copyright (c) 2002 Networks Associates Technology, Inc. All
+Rights Reserved. This program is free software; you can
+redistribute it and/or modify it under the same terms as Perl
+itself.
+
+=cut