Author: ctian
Date: Wed May 23 16:08:52 2007
New Revision: 16
Added:
trunk/lw-dff.lisp
trunk/net-snmp-dff.lisp
trunk/net-snmp.h
Modified:
trunk/asn1.lisp
trunk/classes.lisp
trunk/net-snmp.asd
trunk/package.lisp
Log:
64bit LispWorks support added
Modified: trunk/asn1.lisp
==============================================================================
--- trunk/asn1.lisp (original)
+++ trunk/asn1.lisp Wed May 23 16:08:52 2007
@@ -1,12 +1,13 @@
(in-package :org.net-snmp)
-(eval-when (:compile-toplevel :load-toplevel :execute)
+(eval-when (:compile-toplevel :load-toplevel)
(defclass oid ()
((name :type string :reader oid-name :initarg :name)
(length :type integer :reader oid-length)
c-oids
c-oid-len))
+ #-lispworks
(defmethod shared-initialize :after ((instance oid) slot-names &rest initargs)
(declare (ignore slot-names initargs))
(with-slots (name length c-oids c-oid-len) instance
@@ -19,18 +20,13 @@
(c-get-node name c-oids c-oid-len))
(setf length (mem-ref c-oid-len 'c-size-type)))))
- (defmacro snmp-var->value (var)
- (let ((v (gensym)))
- `(let ((,v ,var))
- (case (foreign-slot-value ,v 'c-variable-list 'c-type)
- ;; ASN_OCTET_STR
- (,+asn-octet-str+
- (foreign-string-to-lisp
- (foreign-slot-value ,v 'c-variable-list 'c-val)
- (foreign-slot-value ,v 'c-variable-list 'c-val-len)))
- ;; ASN_COUNTER
- (,+asn-counter+
- (mem-ref (foreign-slot-value ,v 'c-variable-list 'c-val)
- :uint32))
- (otherwise :others))))))
+ #+lispworks
+ (defmethod shared-initialize :after ((instance oid) slot-names &rest initargs)
+ (declare (ignore slot-names initargs))
+ (with-slots (name length c-oids c-oid-len) instance
+ (progn
+ (setf c-oids (fli:allocate-foreign-object :type 'oid :nelems +max-oid-len+)
+ c-oid-len (fli:allocate-foreign-object :type 'size-t))
+ (read-objid name c-oids c-oid-len)
+ (setf length (fli:dereference c-oid-len))))))
Modified: trunk/classes.lisp
==============================================================================
--- trunk/classes.lisp (original)
+++ trunk/classes.lisp Wed May 23 16:08:52 2007
@@ -27,7 +27,8 @@
:initform "public")
(security-name :reader snmp-security-name
:initarg :security-name
- :type string)
+ :type string
+ :initform "binghe")
(security-level :reader snmp-security-level
:initarg :security-level
:type string
@@ -38,9 +39,10 @@
:initform :hmac-md5)
(passphrase :initarg :passphrase
:type string
- :initform "binghe")
+ :initform "01234567")
c-session))
+#-lispworks
(defmethod shared-initialize :after ((instance snmp-session) slot-names &rest initargs)
(declare (ignore slot-names initargs))
(with-slots (peername version c-session) instance
@@ -99,6 +101,49 @@
(error "Error generating Ku from authentication pass phrase.")))))))
(t (error "unknown snmp version!"))))))
+#+lispworks
+(defmethod shared-initialize :after ((instance snmp-session) slot-names &rest initargs)
+ (declare (ignore slot-names initargs))
+ (with-slots (peername version c-session) instance
+ (progn
+ (setf c-session (fli:allocate-foreign-object :type 'netsnmp-session))
+ (snmp-sess-init c-session)
+ (setf (fli:foreign-slot-value c-session 'peername) (fli:convert-to-foreign-string peername)
+ (fli:foreign-slot-value c-session 'version) version)
+ (cond ((or (= version +snmp-version-1+)
+ (= version +snmp-version-2c+))
+ (with-slots (community) instance
+ (setf (fli:foreign-slot-value c-session 'community) (fli:convert-to-foreign-string community)
+ (fli:foreign-slot-value c-session 'community-len) (length community))))
+ ;; SNMPv3 support
+ ((= version +snmp-version-3+)
+ (with-slots (security-name security-auth-proto passphrase) instance
+ (progn
+ (setf (fli:foreign-slot-value c-session 'security-name) (fli:convert-to-foreign-string security-name)
+ (fli:foreign-slot-value c-session 'security-name-len) (length security-name)
+ ;; we only support authNoPriv now
+ (fli:foreign-slot-value c-session 'security-level) +snmp-sec-level-authnopriv+
+ (fli:foreign-slot-value c-session 'security-auth-key-len) +usm-auth-ku-len+)
+ (case security-auth-proto
+ (:hmac-md5
+ (setf (fli:foreign-slot-value c-session 'security-auth-proto) +usm-hmac-md5-auth-protocol+
+ (fli:foreign-slot-value c-session 'security-auth-proto-len) +usm-hmac-md5-auth-protocol-len+))
+ (:hmac-sha1
+ (setf (fli:foreign-slot-value c-session 'security-auth-proto) +usm-hmac-sha1-auth-protocol+
+ (fli:foreign-slot-value c-session 'security-auth-proto-len) +usm-hmac-sha1-auth-protocol-len+)))
+ (fli:with-foreign-string (c-passphrase c-passphrase-len byte-count)
+ passphrase
+ (declare (ignore byte-count))
+ (if (/= (generate-ku (fli:foreign-slot-value c-session 'security-auth-proto)
+ (fli:foreign-slot-value c-session 'security-auth-proto-len)
+ c-passphrase
+ c-passphrase-len
+ (fli:foreign-array-pointer (fli:foreign-slot-pointer c-session 'security-auth-key) 0)
+ (fli:foreign-slot-pointer c-session 'security-auth-key-len))
+ +snmp-err-success+)
+ (error "Error generating Ku from authentication pass phrase."))))))
+ (t (error "unknown snmp version!"))))))
+
(defmethod snmp-msg-get ((s snmp-session) (o oid))
(car (snmp-msg-get-list s (list o))))
@@ -108,35 +153,100 @@
(defmethod snmp-msg-get ((s string) (o string))
(snmp-msg-get (make-instance 'snmp-session :peername s) o))
+(defmethod snmp-msg-get ((s string) (o oid))
+ (snmp-msg-get (make-instance 'snmp-session :peername s) o))
+
+#-lispworks
(defmethod snmp-msg-get-list ((s snmp-session) (oids list))
(let ((ss (c-snmp-open (slot-value s 'c-session)))
- (pdu (c-snmp-pdu-create +snmp-msg-get+))
- (response (foreign-alloc :pointer :initial-element (null-pointer)))
- values)
+ (pdu (c-snmp-pdu-create +snmp-msg-get+))
+ (response (foreign-alloc :pointer :initial-element (null-pointer)))
+ values)
(progn
;; 1. fill oids into request pdu
(dolist (o oids)
- (let ((real-o (typecase o
- (oid o)
- (string (make-instance 'oid :name o))
- (t (make-instance 'oid :name "")))))
- (c-snmp-add-null-var pdu
- (slot-value real-o 'c-oids)
- (mem-ref (slot-value real-o 'c-oid-len) 'c-size-type))))
+ (let ((real-o (typecase o
+ (oid o)
+ (string (make-instance 'oid :name o))
+ (t (make-instance 'oid :name "")))))
+ (c-snmp-add-null-var pdu
+ (slot-value real-o 'c-oids)
+ (mem-ref (slot-value real-o 'c-oid-len) 'c-size-type))))
;; 2. get results from response pdu
(let ((status (c-snmp-synch-response ss pdu response)))
- (setf values
- (if (and (= status +snmp-stat-success+)
- (= (foreign-slot-value (mem-aref response :pointer) 'c-snmp-pdu 'c-errstat)
- +snmp-err-noerror+))
- (loop for vars = (foreign-slot-value (mem-aref response :pointer)
- 'c-snmp-pdu 'c-variables)
- then (foreign-slot-value vars 'c-variable-list 'c-next-variable)
- until (null-pointer-p vars)
- collect (snmp-var->value vars)))))
+ (setf values
+ (if (and (= status +snmp-stat-success+)
+ (= (foreign-slot-value (mem-aref response :pointer) 'c-snmp-pdu 'c-errstat)
+ +snmp-err-noerror+))
+ (loop for vars = (foreign-slot-value (mem-aref response :pointer)
+ 'c-snmp-pdu 'c-variables)
+ then (foreign-slot-value vars 'c-variable-list 'c-next-variable)
+ until (null-pointer-p vars)
+ collect (snmp-var->value vars)))))
(c-snmp-pdu-free (mem-aref response :pointer))
(c-snmp-close ss)
values)))
+#+lispworks
+(defmethod snmp-msg-get-list ((s snmp-session) (oids list))
+ (let ((ss (snmp-open (slot-value s 'c-session)))
+ (pdu (snmp-pdu-create +snmp-msg-get+))
+ values)
+ (fli:with-dynamic-foreign-objects ((response (:pointer netsnmp-pdu)))
+ (progn
+ ;; 1. fill oids into request pdu
+ (dolist (o oids)
+ (let ((real-o (typecase o
+ (oid o)
+ (string (make-instance 'oid :name o))
+ (t (error "unknown oid type")))))
+ (snmp-add-null-var pdu
+ (slot-value real-o 'c-oids)
+ (fli:dereference (slot-value real-o 'c-oid-len)))))
+ ;; 2. get results from response pdu
+ (let ((status (snmp-synch-response ss pdu response)))
+ (setf values
+ (if (and (= status +snmp-stat-success+)
+ (= (fli:foreign-slot-value (fli:dereference response) 'errstat)
+ +snmp-err-noerror+))
+ (loop for vars = (fli:foreign-slot-value (fli:dereference response)
+ 'variables)
+ then (fli:foreign-slot-value vars 'next-variable)
+ until (fli:null-pointer-p vars)
+ collect (snmp-var->value vars)))))
+ (snmp-free-pdu (fli:dereference response))
+ (snmp-close ss)
+ values))))
+
(defmethod snmp-msg-get-list ((s string) (oids list))
(snmp-msg-get-list (make-instance 'snmp-session :peername s) oids))
+
+#-lispworks
+(defun snmp-var->value (v)
+ (case (foreign-slot-value v 'c-variable-list 'c-type)
+ ;; ASN_OCTET_STR
+ (+asn-octet-str+
+ (foreign-string-to-lisp
+ (foreign-slot-value v 'c-variable-list 'c-val)
+ (foreign-slot-value v 'c-variable-list 'c-val-len)))
+ ;; ASN_COUNTER
+ (+asn-counter+
+ (mem-ref (foreign-slot-value v 'c-variable-list 'c-val)
+ :uint32))
+ (otherwise :others)))
+
+#+lispworks
+(defun snmp-var->value (v)
+ (case (fli:foreign-slot-value v 'type)
+ ;; ASN_INTEGER
+ (#x02
+ (fli:dereference
+ (fli:foreign-slot-value (fli:foreign-slot-pointer v 'val)
+ 'integer)))
+ ;; ASN_OCTET_STR
+ (#x04
+ (fli:convert-from-foreign-string
+ (fli:foreign-slot-value (fli:foreign-slot-pointer v 'val)
+ 'string)
+ :length (fli:foreign-slot-value v 'val-len)))
+ (otherwise (fli:foreign-slot-value v 'type))))
Added: trunk/lw-dff.lisp
==============================================================================
--- (empty file)
+++ trunk/lw-dff.lisp Wed May 23 16:08:52 2007
@@ -0,0 +1,33 @@
+(in-package :org.net-snmp)
+
+(eval-when (:compile-toplevel :load-toplevel)
+ (fli:define-c-typedef (size-t (:foreign-name "size_t"))
+ (:unsigned :long))
+ (fli:define-c-typedef (u-long (:foreign-name "u_long"))
+ (:unsigned :long))
+ (fli:define-c-typedef (oid (:foreign-name "oid")) u-long)
+
+ (fli:define-foreign-function (init-snmp "init_snmp" :source)
+ ;; Page 32 of FLI Manual
+ ((arg-1 (:reference-pass :ef-mb-string)))
+ :result-type :void
+ :language :ansi-c)
+
+ (fli:define-foreign-function (read-objid "read_objid" :source)
+ ((arg-1 (:reference-pass :ef-mb-string))
+ (arg-2 (:pointer oid))
+ (arg-3 (:pointer size-t)))
+ :result-type :int
+ :language :ansi-c)
+
+ (fli:define-foreign-function (get-node "get_node" :source)
+ ((arg-1 (:reference-pass :ef-mb-string))
+ (arg-2 (:pointer oid))
+ (arg-3 (:pointer size-t)))
+ :result-type :int
+ :language :ansi-c))
+
+(eval-when (:load-toplevel)
+ (init-snmp "snmpapp")
+ (format t "Net-SNMP Initialized.~%"))
+
Added: trunk/net-snmp-dff.lisp
==============================================================================
--- (empty file)
+++ trunk/net-snmp-dff.lisp Wed May 23 16:08:52 2007
@@ -0,0 +1,265 @@
+#| DATE : 24 May 2007
+ | USER : binghe
+ | PROCESSED FILE : net-snmp.h
+ |#
+
+(in-package :org.net-snmp)
+
+;;; Derived from file : "/home/binghe/cl-net-snmp/net-snmp.h"
+
+(fli:define-c-typedef (u-char (:foreign-name "u_char"))
+ (:unsigned :char))
+(fli:define-c-typedef (u-short (:foreign-name "u_short"))
+ (:unsigned :short))
+(fli:define-c-typedef (u-int (:foreign-name "u_int")) (:unsigned :int))
+(fli:define-c-struct (counter64 (:foreign-name "counter64"))
+ (high u-long)
+ (low u-long))
+(fli:define-c-struct (variable-list
+ (:foreign-name "variable_list")
+ (:forward-reference t)))
+(fli:define-c-typedef (netsnmp-variable-list
+ (:foreign-name "netsnmp_variable_list"))
+ (:struct variable-list))
+(fli:define-c-struct (netsnmp-transport-s
+ (:foreign-name "netsnmp_transport_s")
+ (:forward-reference t)))
+(fli:define-c-struct (snmp-pdu (:foreign-name "snmp_pdu"))
+ (version :long)
+ (command :int)
+ (reqid :long)
+ (msgid :long)
+ (transid :long)
+ (sessid :long)
+ (errstat :long)
+ (errindex :long)
+ (time u-long)
+ (flags u-long)
+ (security-model :int)
+ (security-level :int)
+ (msg-parse-model :int)
+ (transport-data (:pointer :void))
+ (transport-data-length :int)
+ (t-domain (:pointer (:const oid)))
+ (t-domain-len size-t)
+ (variables (:pointer netsnmp-variable-list))
+ (community (:pointer u-char))
+ (community-len size-t)
+ (enterprise (:pointer oid))
+ (enterprise-length size-t)
+ (trap-type :long)
+ (specific-type :long)
+ (agent-addr (:c-array (:unsigned :char) 4))
+ (context-engine-id (:pointer u-char))
+ (context-engine-idlen size-t)
+ (context-name (:pointer :char))
+ (context-name-len size-t)
+ (security-engine-id (:pointer u-char))
+ (security-engine-idlen size-t)
+ (security-name (:pointer :char))
+ (security-name-len size-t)
+ (priority :int)
+ (range-subid :int)
+ (security-state-ref (:pointer :void)))
+(fli:define-c-typedef (netsnmp-pdu (:foreign-name "netsnmp_pdu"))
+ (:struct snmp-pdu))
+(fli:define-c-struct (snmp-session
+ (:foreign-name "snmp_session")
+ (:forward-reference t)))
+(fli:define-c-typedef (netsnmp-session
+ (:foreign-name "netsnmp_session"))
+ (:struct snmp-session))
+(fli:define-c-typedef (snmp-callback (:foreign-name "snmp_callback"))
+ (:pointer
+ (:function
+ (:int
+ (:pointer netsnmp-session)
+ :int
+ (:pointer netsnmp-pdu)
+ (:pointer :void))
+ :int)))
+(fli:define-c-typedef (netsnmp-callback
+ (:foreign-name "netsnmp_callback"))
+ (:pointer
+ (:function
+ (:int
+ (:pointer netsnmp-session)
+ :int
+ (:pointer netsnmp-pdu)
+ (:pointer :void))
+ :int)))
+(fli:define-c-struct (snmp-session (:foreign-name "snmp_session"))
+ (version :long)
+ (retries :int)
+ (timeout :long)
+ (flags u-long)
+ (subsession (:pointer (:struct snmp-session)))
+ (next (:pointer (:struct snmp-session)))
+ (peername (:pointer :char))
+ (remote-port u-short)
+ (localname (:pointer :char))
+ (local-port u-short)
+ (authenticator
+ (:pointer
+ (:function
+ ((:pointer u-char)
+ (:pointer size-t)
+ (:pointer u-char)
+ size-t)
+ (:pointer u-char))))
+ (callback netsnmp-callback)
+ (callback-magic (:pointer :void))
+ (s-errno :int)
+ (s-snmp-errno :int)
+ (sessid :long)
+ (community (:pointer u-char))
+ (community-len size-t)
+ (rcv-msg-max-size size-t)
+ (snd-msg-max-size size-t)
+ (is-authoritative u-char)
+ (context-engine-id (:pointer u-char))
+ (context-engine-idlen size-t)
+ (engine-boots u-int)
+ (engine-time u-int)
+ (context-name (:pointer :char))
+ (context-name-len size-t)
+ (security-engine-id (:pointer u-char))
+ (security-engine-idlen size-t)
+ (security-name (:pointer :char))
+ (security-name-len size-t)
+ (security-auth-proto (:pointer oid))
+ (security-auth-proto-len size-t)
+ (security-auth-key (:c-array u-char 32))
+ (security-auth-key-len size-t)
+ (security-auth-local-key (:pointer u-char))
+ (security-auth-local-key-len size-t)
+ (security-priv-proto (:pointer oid))
+ (security-priv-proto-len size-t)
+ (security-priv-key (:c-array u-char 32))
+ (security-priv-key-len size-t)
+ (security-priv-local-key (:pointer u-char))
+ (security-priv-local-key-len size-t)
+ (security-model :int)
+ (security-level :int)
+ (security-info (:pointer :void))
+ (myvoid (:pointer :void)))
+(fli:define-c-typedef (netsnmp-vardata
+ (:foreign-name "netsnmp_vardata"))
+ (:union
+ (integer (:pointer :long))
+ (string (:pointer u-char))
+ (objid (:pointer oid))
+ (bitstring (:pointer u-char))
+ (counter64 (:pointer (:struct counter64)))))
+(fli:define-c-struct (variable-list (:foreign-name "variable_list"))
+ (next-variable (:pointer (:struct variable-list)))
+ (name (:pointer oid))
+ (name-length size-t)
+ (type u-char)
+ (val netsnmp-vardata)
+ (val-len size-t)
+ (name-loc (:c-array oid 128))
+ (buf (:c-array u-char 40))
+ (data (:pointer :void))
+ (data-free-hook
+ (:pointer (:function ((:pointer :void)) :void)))
+ (index :int))
+(fli:define-foreign-function (snmp-sess-init "snmp_sess_init" :source)
+ ((arg-1 (:pointer netsnmp-session)))
+ :result-type
+ :void
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-open "snmp_open" :source)
+ ((arg-1 (:pointer netsnmp-session)))
+ :result-type
+ (:pointer netsnmp-session)
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-close "snmp_close" :source)
+ ((arg-1 (:pointer netsnmp-session)))
+ :result-type
+ :int
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-close-sessions
+ "snmp_close_sessions"
+ :source)
+ nil
+ :result-type
+ :int
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-perror "snmp_perror" :source)
+ ((arg-1 (:pointer (:const :char))))
+ :result-type
+ :void
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-errstring "snmp_errstring" :source)
+ ((arg-1 :int))
+ :result-type
+ (:pointer (:const :char))
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-sess-perror
+ "snmp_sess_perror"
+ :source)
+ ((prog-string (:pointer (:const :char)))
+ (ss (:pointer netsnmp-session)))
+ :result-type
+ :void
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-pdu-create
+ "snmp_pdu_create"
+ :source)
+ ((arg-1 :int))
+ :result-type
+ (:pointer netsnmp-pdu)
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-free-pdu "snmp_free_pdu" :source)
+ ((arg-1 (:pointer netsnmp-pdu)))
+ :result-type
+ :void
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-pdu-type "snmp_pdu_type" :source)
+ ((type :int))
+ :result-type
+ (:pointer (:const :char))
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-add-null-var
+ "snmp_add_null_var"
+ :source)
+ ((arg-1 (:pointer netsnmp-pdu))
+ (arg-2 (:pointer (:const oid)))
+ (arg-3 size-t))
+ :result-type
+ (:pointer netsnmp-variable-list)
+ :language
+ :ansi-c)
+(fli:define-foreign-function (snmp-synch-response
+ "snmp_synch_response"
+ :source)
+ ((arg-1 (:pointer netsnmp-session))
+ (arg-2 (:pointer netsnmp-pdu))
+ (arg-3
+ (:pointer (:pointer netsnmp-pdu))))
+ :result-type
+ :int
+ :language
+ :ansi-c)
+(fli:define-foreign-function (generate-ku "generate_Ku" :source)
+ ((hashtype (:pointer (:const oid)))
+ (hashtype-len u-int)
+ (p (:pointer u-char))
+ (pplen size-t)
+ (ku (:pointer u-char))
+ (kulen (:pointer size-t)))
+ :result-type
+ :int
+ :language
+ :ansi-c)
Modified: trunk/net-snmp.asd
==============================================================================
--- trunk/net-snmp.asd (original)
+++ trunk/net-snmp.asd Wed May 23 16:08:52 2007
@@ -2,17 +2,22 @@
(defpackage :net-snmp-system
(:use :cl :asdf))
-
+
(in-package :net-snmp-system)
+
+;;(require "foreign-parser")
+;;(foreign-parser:process-foreign-file "net-snmp.h" :case-sensitive :split-name)
(defsystem net-snmp
:description "Common Lisp interface for Net-SNMP"
- :version "0.10"
+ :version "0.50"
:author "Chun Tian (binghe)"
- :depends-on (:cffi)
+ ;;:depends-on (:cffi)
:components ((:file "package")
(:file "constants" :depends-on ("package"))
- (:file "typedefs" :depends-on ("constants"))
- (:file "asn1" :depends-on ("typedefs"))
- (:file "snmp-api" :depends-on ("constants" "typedefs"))
- (:file "classes" :depends-on ("snmp-api"))))
+ #-lispworks (:file "typedefs" :depends-on ("constants"))
+ #+lispworks (:file "lw-dff" :depends-on ("package"))
+ #+lispworks (:file "net-snmp-dff" :depends-on ("package"))
+ #-lispworks (:file "snmp-api" :depends-on ("constants" "typedefs"))
+ (:file "asn1" :depends-on (#-lispworks "typedefs" #+lispworks "net-snmp-dff"))))
+ ;;(:file "classes" :depends-on ("snmp-api"))))
Added: trunk/net-snmp.h
==============================================================================
--- (empty file)
+++ trunk/net-snmp.h Wed May 23 16:08:52 2007
@@ -0,0 +1,309 @@
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+
+struct counter64 {
+ u_long high;
+ u_long low;
+};
+
+struct variable_list;
+typedef struct variable_list netsnmp_variable_list;
+struct netsnmp_transport_s;
+
+#define USM_AUTH_KU_LEN 32
+#define USM_PRIV_KU_LEN 32
+#define MIN_OID_LEN 2
+#define MAX_OID_LEN 128 /* max subid's in an oid */
+
+/** @typedef struct snmp_pdu to netsnmp_pdu
+ * Typedefs the snmp_pdu struct into netsnmp_pdu */
+/** @struct snmp_pdu
+ * The snmp protocol data unit.
+ */
+typedef struct snmp_pdu {
+
+ /*
+ * Protocol-version independent fields
+ */
+ /** snmp version */
+ long version;
+ /** Type of this PDU */
+ int command;
+ /** Request id - note: not incremented on retries */
+ long reqid;
+ /** Message id for V3 messages note: incremented for each retry */
+ long msgid;
+ /** Unique ID for incoming transactions */
+ long transid;
+ /** Session id for AgentX messages */
+ long sessid;
+ /** Error status (non_repeaters in GetBulk) */
+ long errstat;
+ /** Error index (max_repetitions in GetBulk) */
+ long errindex;
+ /** Uptime */
+ u_long time;
+ u_long flags;
+
+ int securityModel;
+ /** noAuthNoPriv, authNoPriv, authPriv */
+ int securityLevel;
+ int msgParseModel;
+
+ /**
+ * Transport-specific opaque data. This replaces the IP-centric address
+ * field.
+ */
+
+ void *transport_data;
+ int transport_data_length;
+
+ /**
+ * The actual transport domain. This SHOULD NOT BE FREE()D.
+ */
+
+ const oid *tDomain;
+ size_t tDomainLen;
+
+ netsnmp_variable_list *variables;
+
+
+ /*
+ * SNMPv1 & SNMPv2c fields
+ */
+ /** community for outgoing requests. */
+ u_char *community;
+ /** length of community name. */
+ size_t community_len;
+
+ /*
+ * Trap information
+ */
+ /** System OID */
+ oid *enterprise;
+ size_t enterprise_length;
+ /** trap type */
+ long trap_type;
+ /** specific type */
+ long specific_type;
+ /** This is ONLY used for v1 TRAPs */
+ unsigned char agent_addr[4];
+
+ /*
+ * SNMPv3 fields
+ */
+ /** context snmpEngineID */
+ u_char *contextEngineID;
+ /** Length of contextEngineID */
+ size_t contextEngineIDLen;
+ /** authoritative contextName */
+ char *contextName;
+ /** Length of contextName */
+ size_t contextNameLen;
+ /** authoritative snmpEngineID for security */
+ u_char *securityEngineID;
+ /** Length of securityEngineID */
+ size_t securityEngineIDLen;
+ /** on behalf of this principal */
+ char *securityName;
+ /** Length of securityName. */
+ size_t securityNameLen;
+
+ /*
+ * AgentX fields
+ * (also uses SNMPv1 community field)
+ */
+ int priority;
+ int range_subid;
+
+ void *securityStateRef;
+} netsnmp_pdu;
+
+struct snmp_session;
+
+/** @typedef struct snmp_session netsnmp_session
+ * Typedefs the snmp_session struct intonetsnmp_session */
+typedef struct snmp_session netsnmp_session;
+
+typedef int (*snmp_callback) (int, netsnmp_session *, int,
+ netsnmp_pdu *, void *);
+typedef int (*netsnmp_callback) (int, netsnmp_session *, int,
+ netsnmp_pdu *, void *);
+
+/** @struct snmp_session
+ * The snmp session structure.
+ */
+struct snmp_session {
+ /*
+ * Protocol-version independent fields
+ */
+ /** snmp version */
+ long version;
+ /** Number of retries before timeout. */
+ int retries;
+ /** Number of uS until first timeout, then exponential backoff */
+ long timeout;
+ u_long flags;
+ struct snmp_session *subsession;
+ struct snmp_session *next;
+
+ /** Domain name or dotted IP address of default peer */
+ char *peername;
+ /** UDP port number of peer. */
+ u_short remote_port;
+ /** My Domain name or dotted IP address, 0 for default */
+ char *localname;
+ /** My UDP port number, 0 for default, picked randomly */
+ u_short local_port;
+ /**
+ * Authentication function or NULL if null authentication is used
+ */
+ u_char *(*authenticator) (u_char *, size_t *, u_char *, size_t);
+ /** Function to interpret incoming data */
+ netsnmp_callback callback;
+ /**
+ * Pointer to data that the callback function may consider important
+ */
+ void *callback_magic;
+ /** copy of system errno */
+ int s_errno;
+ /** copy of library errno */
+ int s_snmp_errno;
+ /** Session id - AgentX only */
+ long sessid;
+
+ /*
+ * SNMPv1 & SNMPv2c fields
+ */
+ /** community for outgoing requests. */
+ u_char *community;
+ /** Length of community name. */
+ size_t community_len;
+ /** Largest message to try to receive. */
+ size_t rcvMsgMaxSize;
+ /** Largest message to try to send. */
+ size_t sndMsgMaxSize;
+
+ /*
+ * SNMPv3 fields
+ */
+ /** are we the authoritative engine? */
+ u_char isAuthoritative;
+ /** authoritative snmpEngineID */
+ u_char *contextEngineID;
+ /** Length of contextEngineID */
+ size_t contextEngineIDLen;
+ /** initial engineBoots for remote engine */
+ u_int engineBoots;
+ /** initial engineTime for remote engine */
+ u_int engineTime;
+ /** authoritative contextName */
+ char *contextName;
+ /** Length of contextName */
+ size_t contextNameLen;
+ /** authoritative snmpEngineID */
+ u_char *securityEngineID;
+ /** Length of contextEngineID */
+ size_t securityEngineIDLen;
+ /** on behalf of this principal */
+ char *securityName;
+ /** Length of securityName. */
+ size_t securityNameLen;
+
+ /** auth protocol oid */
+ oid *securityAuthProto;
+ /** Length of auth protocol oid */
+ size_t securityAuthProtoLen;
+ /** Ku for auth protocol XXX */
+ u_char securityAuthKey[USM_AUTH_KU_LEN];
+ /** Length of Ku for auth protocol */
+ size_t securityAuthKeyLen;
+ /** Kul for auth protocol */
+ u_char *securityAuthLocalKey;
+ /** Length of Kul for auth protocol XXX */
+ size_t securityAuthLocalKeyLen;
+
+ /** priv protocol oid */
+ oid *securityPrivProto;
+ /** Length of priv protocol oid */
+ size_t securityPrivProtoLen;
+ /** Ku for privacy protocol XXX */
+ u_char securityPrivKey[USM_PRIV_KU_LEN];
+ /** Length of Ku for priv protocol */
+ size_t securityPrivKeyLen;
+ /** Kul for priv protocol */
+ u_char *securityPrivLocalKey;
+ /** Length of Kul for priv protocol XXX */
+ size_t securityPrivLocalKeyLen;
+
+ /** snmp security model, v1, v2c, usm */
+ int securityModel;
+ /** noAuthNoPriv, authNoPriv, authPriv */
+ int securityLevel;
+
+ /**
+ * security module specific
+ */
+ void *securityInfo;
+
+ /**
+ * use as you want data
+ */
+ void *myvoid;
+};
+
+typedef union {
+ long *integer;
+ u_char *string;
+ oid *objid;
+ u_char *bitstring;
+ struct counter64 *counter64;
+} netsnmp_vardata;
+
+/** @struct variable_list
+ * The netsnmp variable list binding structure, it's typedef'd to
+ * netsnmp_variable_list.
+ */
+struct variable_list {
+ /** NULL for last variable */
+ struct variable_list *next_variable;
+ /** Object identifier of variable */
+ oid *name;
+ /** number of subid's in name */
+ size_t name_length;
+ /** ASN type of variable */
+ u_char type;
+ /** value of variable */
+ netsnmp_vardata val;
+ /** the length of the value to be copied into buf */
+ size_t val_len;
+ /** 90 percentile < 24. */
+ oid name_loc[MAX_OID_LEN];
+ /** 90 percentile < 40. */
+ u_char buf[40];
+ /** (Opaque) hook for additional data */
+ void *data;
+ /** callback to free above */
+ void (*dataFreeHook)(void *);
+ int index;
+};
+
+void snmp_sess_init(netsnmp_session *);
+netsnmp_session *snmp_open(netsnmp_session *);
+int snmp_close(netsnmp_session *);
+int snmp_close_sessions(void);
+extern void snmp_perror(const char *);
+const char *snmp_errstring(int);
+void snmp_sess_perror(const char *prog_string,
+ netsnmp_session * ss);
+netsnmp_pdu *snmp_pdu_create(int);
+void snmp_free_pdu(netsnmp_pdu *);
+const char * snmp_pdu_type(int type);
+int get_node(const char *, oid *, size_t *);
+netsnmp_variable_list *snmp_add_null_var(netsnmp_pdu *, const oid *, size_t);
+int snmp_synch_response(netsnmp_session *, netsnmp_pdu *,
+ netsnmp_pdu **);
+int generate_Ku(const oid * hashtype, u_int hashtype_len,
+ u_char * P, size_t pplen,
+ u_char * Ku, size_t * kulen);
Modified: trunk/package.lisp
==============================================================================
--- trunk/package.lisp (original)
+++ trunk/package.lisp Wed May 23 16:08:52 2007
@@ -2,7 +2,7 @@
(defpackage :org.net-snmp
(:nicknames :snmp)
- (:use :cl :cffi)
+ (:use :cl #-lispworks :cffi)
(:export
;; class
snmp-session oid
@@ -16,14 +16,13 @@
(in-package :org.net-snmp)
-(eval-when (:compile-toplevel :load-toplevel :execute)
- (define-foreign-library libssl
- (:unix (:or "libssl.so.0.9.8" "libssl.so"))
- (t (:default "libssl")))
-
+#-lispworks
+(eval-when (:compile-toplevel :load-toplevel)
(define-foreign-library libsnmp
- (:unix (:or "libsnmp.so.15" "libsnmp.so"))
+ (:unix "libsnmp.so.9")
(t (:default "libsnmp")))
-
- (use-foreign-library libssl)
(use-foreign-library libsnmp))
+
+#+lispworks
+(eval-when (:compile-toplevel :load-toplevel)
+ (fli:register-module "libsnmp.so.9"))