summaryrefslogtreecommitdiffstats
path: root/python-ethtool/etherinfo.c
diff options
context:
space:
mode:
authorDavid Sommerseth <davids@redhat.com>2013-12-20 02:20:21 +0100
committerDavid Sommerseth <davids@redhat.com>2013-12-20 02:22:48 +0100
commit54a6b0bea9e210c0377c3510d8819df59c009d64 (patch)
tree7795a60a1e63de04e1f8d44680c26d75025d2990 /python-ethtool/etherinfo.c
parentd4bc3a50bb6124a0000879f27d43e9685934d682 (diff)
downloadpython-ethtool-54a6b0bea9e210c0377c3510d8819df59c009d64.tar.gz
python-ethtool-54a6b0bea9e210c0377c3510d8819df59c009d64.tar.xz
python-ethtool-54a6b0bea9e210c0377c3510d8819df59c009d64.zip
Merge struct etherinfo and etherinfo_py
Make things more "pythonic" and avoid another layer of wrapping by removing the struct etherinfo. Move that information to the main Python object instead. This simplifies the object creation and handling too, as now all strings are python objects. Also update some of the documentation blocks along the way. Signed-off-by: David Sommerseth <davids@redhat.com>
Diffstat (limited to 'python-ethtool/etherinfo.c')
-rw-r--r--python-ethtool/etherinfo.c70
1 files changed, 28 insertions, 42 deletions
diff --git a/python-ethtool/etherinfo.c b/python-ethtool/etherinfo.c
index 88cefc8..224cb26 100644
--- a/python-ethtool/etherinfo.c
+++ b/python-ethtool/etherinfo.c
@@ -41,23 +41,6 @@
*
*/
-/**
- * Frees the memory used by struct etherinfo
- *
- * @param ptr Pointer to a struct etherninfo element
- */
-void free_etherinfo(struct etherinfo *ptr)
-{
- if( ptr == NULL ) { // Just for safety
- return;
- }
-
- Py_XDECREF(ptr->device);
- Py_XDECREF(ptr->hwaddress);
-
- free(ptr);
-}
-
/**
* libnl callback function. Does the real parsing of a record returned by NETLINK. This function
@@ -68,7 +51,7 @@ void free_etherinfo(struct etherinfo *ptr)
*/
static void callback_nl_link(struct nl_object *obj, void *arg)
{
- struct etherinfo *ethi = (struct etherinfo *) arg;
+ etherinfo_py *ethi = (etherinfo_py *) arg;
struct rtnl_link *link = (struct rtnl_link *) obj;
char hwaddr[130];
@@ -125,12 +108,12 @@ static void callback_nl_address(struct nl_object *obj, void *arg)
/**
* Sets the etherinfo.index member to the corresponding device set in etherinfo.device
*
- * @param ethinf A pointer a struct etherinfo element which contains the device name
- * and a place to save the corresponding index value.
+ * @param self A pointer the current etherinfo_py Python object which contains the device name
+ * and the place where to save the corresponding index value.
*
* @return Returns 1 on success, otherwise 0.
*/
-static int _set_device_index(struct etherinfo *ethinf)
+static int _set_device_index(etherinfo_py *self)
{
struct nl_cache *link_cache;
struct rtnl_link *link;
@@ -139,19 +122,19 @@ static int _set_device_index(struct etherinfo *ethinf)
* As we don't expect it to change, we're reusing a "cached"
* interface index if we have that
*/
- if( ethinf->index < 0 ) {
+ if( self->index < 0 ) {
if( rtnl_link_alloc_cache(get_nlc(), AF_UNSPEC, &link_cache) < 0) {
return 0;
}
- link = rtnl_link_get_by_name(link_cache, PyString_AsString(ethinf->device));
+ link = rtnl_link_get_by_name(link_cache, PyString_AsString(self->device));
if( !link ) {
nl_cache_free(link_cache);
return 0;
}
- ethinf->index = rtnl_link_get_ifindex(link);
- if( ethinf->index < 0 ) {
+ self->index = rtnl_link_get_ifindex(link);
+ if( self->index < 0 ) {
rtnl_link_put(link);
nl_cache_free(link_cache);
return 0;
@@ -169,26 +152,31 @@ static int _set_device_index(struct etherinfo *ethinf)
*
*/
+/**
+ * Populate the etherinfo_py Python object with link information for the current device
+ *
+ * @param self Pointer to the device object, a etherinfo_py Python object
+ *
+ * @return Returns 1 on success, otherwise 0
+ */
int get_etherinfo_link(etherinfo_py *self)
{
struct nl_cache *link_cache;
struct rtnl_link *link;
- struct etherinfo *ethinf = NULL;
- if( !self || !self->ethinfo ) {
+ if( !self ) {
return 0;
}
- ethinf = self->ethinfo;
/* Open a NETLINK connection on-the-fly */
if( !open_netlink(self) ) {
PyErr_Format(PyExc_RuntimeError,
"Could not open a NETLINK connection for %s",
- PyString_AsString(ethinf->device));
+ PyString_AsString(self->device));
return 0;
}
- if( _set_device_index(ethinf) != 1) {
+ if( _set_device_index(self) != 1) {
return 0;
}
@@ -198,8 +186,8 @@ int get_etherinfo_link(etherinfo_py *self)
}
link = rtnl_link_alloc();
/* FIXME: Error handling? */
- rtnl_link_set_ifindex(link, ethinf->index);
- nl_cache_foreach_filter(link_cache, OBJ_CAST(link), callback_nl_link, ethinf);
+ rtnl_link_set_ifindex(link, self->index);
+ nl_cache_foreach_filter(link_cache, OBJ_CAST(link), callback_nl_link, self);
rtnl_link_put(link);
nl_cache_free(link_cache);
@@ -211,10 +199,10 @@ int get_etherinfo_link(etherinfo_py *self)
/**
* Query NETLINK for device IP address configuration
*
- * @param ethinf Pointer to an available struct etherinfo element. The 'device' member
- * must contain a valid string to the device to query for information
- * @param nlc Pointer to the libnl handle, which is used for the query against NETLINK
- * @param query What to query for. Must be NLQRY_ADDR4 or NLQRY_ADDR6.
+ * @param self A etherinfo_py Python object for the current device to retrieve IP address
+ * configuration data from
+ * @param query What to query for. Must be NLQRY_ADDR4 for IPv4 addresses or NLQRY_ADDR6
+ * for IPv6 addresses.
*
* @return Returns a Python list containing PyNetlinkIPaddress objects on success, otherwise NULL
*/
@@ -222,23 +210,21 @@ PyObject * get_etherinfo_address(etherinfo_py *self, nlQuery query)
{
struct nl_cache *addr_cache;
struct rtnl_addr *addr;
- struct etherinfo *ethinf = NULL;
PyObject *addrlist = NULL;
- if( !self || !self->ethinfo ) {
+ if( !self ) {
return NULL;
}
- ethinf = self->ethinfo;
/* Open a NETLINK connection on-the-fly */
if( !open_netlink(self) ) {
PyErr_Format(PyExc_RuntimeError,
"Could not open a NETLINK connection for %s",
- PyString_AsString(ethinf->device));
+ PyString_AsString(self->device));
return NULL;
}
- if( _set_device_index(ethinf) != 1) {
+ if( _set_device_index(self) != 1) {
return NULL;
}
@@ -251,7 +237,7 @@ PyObject * get_etherinfo_address(etherinfo_py *self, nlQuery query)
}
addr = rtnl_addr_alloc();
/* FIXME: Error handling? */
- rtnl_addr_set_ifindex(addr, ethinf->index);
+ rtnl_addr_set_ifindex(addr, self->index);
switch( query ) {
case NLQRY_ADDR4: