Browse Source

fix setLinkUp/Down commands

master
Brad Parker 11 years ago
parent
commit
3d8f02bb63
  1. 70
      interface.cpp

70
interface.cpp

@ -41,82 +41,108 @@ m_index(-1)
m_index = Utils::interfaceIndex(interface);
}
bool Interface::setLinkUp(QString &error) {
/*!
Set the interface's administrative link state to up. Requires that the CAP_NET_ADMIN capability be set on the application binary, or run as root (\a not \a recommended). Returns 0 on success, 1 on error.
*/
int Interface::setLinkUp(QString &error) {
struct rtnl_link *link, *link_orig = NULL;
struct nl_sock *sock = NULL;
QByteArray interfaceArray = m_interface.toLatin1();
const char *interface = interfaceArray.constData();
if((sock = Utils::connect())) {
rtnl_link_get_kernel(sock, 0, interface, &link_orig);
if(rtnl_link_get_kernel(sock, 0, interface, &link) < 0) {
if(rtnl_link_get_kernel(sock, 0, interface, &link_orig) < 0) {
std::cerr << "error looking up interface" << std::endl;
nl_socket_free(sock);
}else{
unsigned int flags = rtnl_link_get_flags(link);
int err = 0;
if(!link_orig) {
std::cerr << "can't get link" << std::endl;
nl_socket_free(sock);
return 0;
}
flags |= IFF_UP;
link = rtnl_link_alloc();
rtnl_link_set_flags(link, flags);
if(!link) {
std::cerr << "can't alloc link" << std::endl;
rtnl_link_put(link_orig);
nl_socket_free(sock);
return 0;
}
int err = 0;
rtnl_link_set_flags(link, IFF_UP);
if((err = rtnl_link_change(sock, link_orig, link, 0)) < 0) {
error = nl_geterror(err);
rtnl_link_put(link);
rtnl_link_put(link_orig);
nl_socket_free(sock);
return false;
return 0;
}
rtnl_link_put(link);
rtnl_link_put(link_orig);
nl_socket_free(sock);
return true;
return 1;
}
}
return false;
return 0;
}
bool Interface::setLinkDown(QString &error) {
/*!
Set the interface's administrative link state to down. Requires that the CAP_NET_ADMIN capability be set on the application binary, or run as root (\a not \a recommended). Returns 0 on success, 1 on error.
*/
int Interface::setLinkDown(QString &error) {
struct rtnl_link *link, *link_orig = NULL;
struct nl_sock *sock = NULL;
QByteArray interfaceArray = m_interface.toLatin1();
const char *interface = interfaceArray.constData();
if((sock = Utils::connect())) {
rtnl_link_get_kernel(sock, 0, interface, &link_orig);
if(rtnl_link_get_kernel(sock, 0, interface, &link) < 0) {
if(rtnl_link_get_kernel(sock, 0, interface, &link_orig) < 0) {
std::cerr << "error looking up interface" << std::endl;
nl_socket_free(sock);
}else{
unsigned int flags = rtnl_link_get_flags(link);
int err = 0;
if(!link_orig) {
std::cerr << "can't get link" << std::endl;
nl_socket_free(sock);
return 0;
}
flags &= ~IFF_UP;
link = rtnl_link_alloc();
rtnl_link_set_flags(link, flags);
if(!link) {
std::cerr << "can't alloc link" << std::endl;
rtnl_link_put(link_orig);
nl_socket_free(sock);
return 0;
}
int err = 0;
rtnl_link_unset_flags(link, IFF_UP);
if((err = rtnl_link_change(sock, link_orig, link, 0)) < 0) {
error = nl_geterror(err);
rtnl_link_put(link);
rtnl_link_put(link_orig);
nl_socket_free(sock);
return false;
return 0;
}
rtnl_link_put(link);
rtnl_link_put(link_orig);
nl_socket_free(sock);
return true;
return 1;
}
}
return false;
return 0;
}
/*!

Loading…
Cancel
Save