summaryrefslogtreecommitdiff
path: root/src/VBox/Main/src-server/generic/NetIf-generic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Main/src-server/generic/NetIf-generic.cpp')
-rw-r--r--src/VBox/Main/src-server/generic/NetIf-generic.cpp51
1 files changed, 44 insertions, 7 deletions
diff --git a/src/VBox/Main/src-server/generic/NetIf-generic.cpp b/src/VBox/Main/src-server/generic/NetIf-generic.cpp
index fdf72d6f..2f99585b 100644
--- a/src/VBox/Main/src-server/generic/NetIf-generic.cpp
+++ b/src/VBox/Main/src-server/generic/NetIf-generic.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2009-2010 Oracle Corporation
+ * Copyright (C) 2009-2012 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -21,6 +21,15 @@
#include <iprt/env.h>
#include <iprt/path.h>
#include <iprt/param.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#include <net/if.h>
+#include <errno.h>
+#include <unistd.h>
+
+#if defined(RT_OS_SOLARIS)
+# include <sys/sockio.h>
+#endif
#if defined(RT_OS_LINUX) || defined(RT_OS_DARWIN)
# include <cstdio>
@@ -218,6 +227,11 @@ int NetIfCreateHostOnlyNetworkInterface(VirtualBox *pVBox,
char szBuf[128]; /* We are not interested in long error messages. */
if (fgets(szBuf, sizeof(szBuf), fp))
{
+ /* Remove trailing new line characters. */
+ char *pLast = szBuf + strlen(szBuf) - 1;
+ if (pLast >= szBuf && *pLast == '\n')
+ *pLast = 0;
+
if (!strncmp(VBOXNETADPCTL_NAME ":", szBuf, sizeof(VBOXNETADPCTL_NAME)))
{
progress->notifyComplete(E_FAIL,
@@ -227,9 +241,6 @@ int NetIfCreateHostOnlyNetworkInterface(VirtualBox *pVBox,
pclose(fp);
return E_FAIL;
}
- char *pLast = szBuf + strlen(szBuf) - 1;
- if (pLast >= szBuf && *pLast == '\n')
- *pLast = 0;
size_t cbNameLen = strlen(szBuf) + 1;
PNETIFINFO pInfo = (PNETIFINFO)RTMemAllocZ(RT_OFFSETOF(NETIFINFO, szName[cbNameLen]));
@@ -307,7 +318,7 @@ int NetIfRemoveHostOnlyNetworkInterface(VirtualBox *pVBox, IN_GUID aId,
ComPtr<IHost> host;
int rc = VINF_SUCCESS;
HRESULT hr = pVBox->COMGETTER(Host)(host.asOutParam());
- if(SUCCEEDED(hr))
+ if (SUCCEEDED(hr))
{
Bstr ifname;
ComPtr<IHostNetworkInterface> iface;
@@ -320,7 +331,7 @@ int NetIfRemoveHostOnlyNetworkInterface(VirtualBox *pVBox, IN_GUID aId,
rc = progress->init(pVBox, host,
Bstr("Removing host network interface").raw(),
FALSE /* aCancelable */);
- if(SUCCEEDED(rc))
+ if (SUCCEEDED(rc))
{
progress.queryInterfaceTo(aProgress);
rc = NetIfAdpCtl(Utf8Str(ifname).c_str(), "remove", NULL, NULL);
@@ -352,8 +363,34 @@ int NetIfGetConfig(HostNetworkInterface * /* pIf */, NETIFINFO *)
return VERR_NOT_IMPLEMENTED;
}
-int NetIfDhcpRediscover(VirtualBox * /* pVbox */, HostNetworkInterface * /* pIf */)
+int NetIfDhcpRediscover(VirtualBox * /* pVBox */, HostNetworkInterface * /* pIf */)
{
return VERR_NOT_IMPLEMENTED;
}
+/**
+ * Obtain the current state of the interface.
+ *
+ * @returns VBox status code.
+ *
+ * @param pcszIfName Interface name.
+ * @param penmState Where to store the retrieved state.
+ */
+int NetIfGetState(const char *pcszIfName, NETIFSTATUS *penmState)
+{
+ int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
+ if (sock < 0)
+ return VERR_OUT_OF_RESOURCES;
+ struct ifreq Req;
+ RT_ZERO(Req);
+ RTStrCopy(Req.ifr_name, sizeof(Req.ifr_name), pcszIfName);
+ if (ioctl(sock, SIOCGIFFLAGS, &Req) < 0)
+ {
+ Log(("NetIfGetState: ioctl(SIOCGIFFLAGS) -> %d\n", errno));
+ *penmState = NETIF_S_UNKNOWN;
+ }
+ else
+ *penmState = (Req.ifr_flags & IFF_UP) ? NETIF_S_UP : NETIF_S_DOWN;
+ close(sock);
+ return VINF_SUCCESS;
+}