user961346
user961346

Reputation: 301

ctypes and passing a by reference to a function

I'm trying to use libpcap in python3 using ctypes.

given the following function in C

pcap_lookupnet(dev, &net, &mask, errbuf)

in python I have the following

pcap_lookupnet = pcap.pcap_lookupnet

mask = ctypes.c_uint32
net = ctypes.c_int32

if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
print("Error could not get netmask for device {0}".format(errbuf))
sys.exit(0)

and the error i get is

  File "./libpcap.py", line 63, in <module>
 if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
ctypes.ArgumentError: argument 2: <class 'TypeError'>: Don't know how to convert parameter 2

how do you deal with &blah values ?

Upvotes: 8

Views: 24891

Answers (3)

David Heffernan
David Heffernan

Reputation: 613322

You need to create instances for net and mask, and use byref to pass them.

mask = ctypes.c_uint32()
net = ctypes.c_int32()
pcap_lookupnet(dev, ctypes.byref(net), ctypes.byref(mask), errbuf)

Upvotes: 27

Mark Tolonen
Mark Tolonen

Reputation: 177971

ctypes.c_uint32 is a type. You need an instance:

mask = ctypes.c_uint32()
net = ctypes.c_int32()

Then pass using ctypes.byref:

pcap_lookupnet(dev,ctypes.byref(mask),ctypes.byref(net),errbuf)

You can retrieve the value using mask.value.

Upvotes: 3

DNS
DNS

Reputation: 38199

You probably need to use ctypes.pointer, like this:

pcap_lookupnet(dev, ctypes.pointer(net), ctypes.pointer(mask), errbuf)

See the ctypes tutorial section on pointers for more information.

I'm assuming you've created ctypes proxies for the other arguments as well. If dev requires a string, for example, you can't simply pass in a Python string; you need to create a ctypes_wchar_p or something along those lines.

Upvotes: 2

Related Questions