hi!
my first look into gsnmp:
i saw a couple of 'not thread safe' comments, why so ? because glib-2.0/2.2 is thread-safe.
if its for the socket methods, why not port to gnet, paired with the glib thread-queues makes a really powerful dispatcher mechanism, instead of the slist ;)~ (but has no ipv6 support yet).
one particular problem may arise if you have several different snmp-tools running on one machine, where each of those believes in its exlusive right to bind to port 161/udp (one wins the others loose), so do you really need to make a request from that specific port ?
you could modify the GSnmpTransport struct to include a socket (gnet or otherwise) and the function-map is already there to send/recv the pdus.
much like (with gnet):
typedef struct _GSnmpUdpTransport { GSnmpTDomain tdomain; /* transport domain */ gchar *name; /* name of the transport domain */ GUdpSocket *socket; gboolean (*sendMessage) ( GUdpSocket *socket, GInetAddr *targetHost, guchar *outgoingMessage, guint outgoingMessageLength ); gboolean (*receiveMessage) ( GUdpSocket *socket, GInetAddr **sourceHost, guchar **incomingMessage, guint *incomingMessageLength ); gboolean (*resolveAddress) ( gchar *targetHost, guint16 port, GInetAddr **address ); gboolean (*initSocket) ( GUdpSocket **socket ); gboolean (*closeSocket) ( GUdpSocket *socket ); } GSnmpUdpTransport;
typedef struct _GSnmpTcpTransport { GSnmpTDomain tdomain; /* transport domain */ gchar *name; /* name of the transport domain */ GTcpSocket *socket; gboolean (*sendMessage) ( GTcpSocket *socket, guchar *outgoingMessage, guint outgoingMessageLength ); gboolean (*receiveMessage) ( GTcpSocket *socket, guchar **incomingMessage, guint *incomingMessageLength ); gboolean (*resolveAddress) ( gchar *targetHost, guint16 port, GInetAddr **address ); gboolean (*initSocket) ( GInetAddr *targetHost, GTcpSocket **socket ); gboolean (*closeSocket) ( GTcpSocket *socket ); } GSnmpTcpTransport;
do you see the light ?
-- fredo