mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-05 05:45:46 +00:00
Add internal APIs for dealing with namespaces
Add some APIs for acquiring namespace file descriptors and switching namespaces Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
3fd121c170
commit
5f669ea976
@ -180,7 +180,7 @@ dnl Availability of various common functions (non-fatal if missing),
|
|||||||
dnl and various less common threadsafe functions
|
dnl and various less common threadsafe functions
|
||||||
AC_CHECK_FUNCS_ONCE([cfmakeraw geteuid getgid getgrnam_r getmntent_r \
|
AC_CHECK_FUNCS_ONCE([cfmakeraw geteuid getgid getgrnam_r getmntent_r \
|
||||||
getpwuid_r getuid initgroups kill mmap newlocale posix_fallocate \
|
getpwuid_r getuid initgroups kill mmap newlocale posix_fallocate \
|
||||||
posix_memalign regexec sched_getaffinity])
|
posix_memalign regexec sched_getaffinity setns])
|
||||||
|
|
||||||
dnl Availability of pthread functions (if missing, win32 threading is
|
dnl Availability of pthread functions (if missing, win32 threading is
|
||||||
dnl assumed). Because of $LIB_PTHREAD, we cannot use AC_CHECK_FUNCS_ONCE.
|
dnl assumed). Because of $LIB_PTHREAD, we cannot use AC_CHECK_FUNCS_ONCE.
|
||||||
|
@ -1795,9 +1795,11 @@ virPidFileWritePath;
|
|||||||
# virprocess.h
|
# virprocess.h
|
||||||
virProcessAbort;
|
virProcessAbort;
|
||||||
virProcessGetAffinity;
|
virProcessGetAffinity;
|
||||||
|
virProcessGetNamespaces;
|
||||||
virProcessKill;
|
virProcessKill;
|
||||||
virProcessKillPainfully;
|
virProcessKillPainfully;
|
||||||
virProcessSetAffinity;
|
virProcessSetAffinity;
|
||||||
|
virProcessSetNamespaces;
|
||||||
virProcessTranslateStatus;
|
virProcessTranslateStatus;
|
||||||
virProcessWait;
|
virProcessWait;
|
||||||
|
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
@ -30,6 +32,7 @@
|
|||||||
#include "virprocess.h"
|
#include "virprocess.h"
|
||||||
#include "virerror.h"
|
#include "virerror.h"
|
||||||
#include "viralloc.h"
|
#include "viralloc.h"
|
||||||
|
#include "virfile.h"
|
||||||
#include "virlog.h"
|
#include "virlog.h"
|
||||||
#include "virutil.h"
|
#include "virutil.h"
|
||||||
|
|
||||||
@ -489,3 +492,116 @@ int virProcessGetAffinity(pid_t pid ATTRIBUTE_UNUSED,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_SCHED_GETAFFINITY */
|
#endif /* HAVE_SCHED_GETAFFINITY */
|
||||||
|
|
||||||
|
|
||||||
|
#if HAVE_SETNS
|
||||||
|
int virProcessGetNamespaces(pid_t pid,
|
||||||
|
size_t *nfdlist,
|
||||||
|
int **fdlist)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
DIR *dh = NULL;
|
||||||
|
struct dirent *de;
|
||||||
|
char *nsdir = NULL;
|
||||||
|
char *nsfile = NULL;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
*nfdlist = 0;
|
||||||
|
*fdlist = NULL;
|
||||||
|
|
||||||
|
if (virAsprintf(&nsdir, "/proc/%llu/ns",
|
||||||
|
(unsigned long long)pid) < 0) {
|
||||||
|
virReportOOMError();
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dh = opendir(nsdir))) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Cannot read directory %s"),
|
||||||
|
nsdir);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((de = readdir(dh))) {
|
||||||
|
int fd;
|
||||||
|
if (de->d_name[0] == '.')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (VIR_EXPAND_N(*fdlist, *nfdlist, 1) < 0) {
|
||||||
|
virReportOOMError();
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virAsprintf(&nsfile, "%s/%s", nsdir, de->d_name) < 0) {
|
||||||
|
virReportOOMError();
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((fd = open(nsfile, O_RDWR)) < 0) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Unable to open %s"),
|
||||||
|
nsfile);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*fdlist)[(*nfdlist)-1] = fd;
|
||||||
|
|
||||||
|
VIR_FREE(nsfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (dh)
|
||||||
|
closedir(dh);
|
||||||
|
VIR_FREE(nsdir);
|
||||||
|
VIR_FREE(nsfile);
|
||||||
|
if (ret < 0) {
|
||||||
|
for (i = 0 ; i < *nfdlist ; i++) {
|
||||||
|
VIR_FORCE_CLOSE((*fdlist)[i]);
|
||||||
|
}
|
||||||
|
VIR_FREE(*fdlist);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int virProcessSetNamespaces(size_t nfdlist,
|
||||||
|
int *fdlist)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (nfdlist == 0) {
|
||||||
|
virReportInvalidArg(nfdlist, "%s",
|
||||||
|
_("Expected at least one file descriptor"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (i = 0 ; i < nfdlist ; i++) {
|
||||||
|
if (setns(fdlist[i], 0) < 0) {
|
||||||
|
virReportSystemError(errno, "%s",
|
||||||
|
_("Unable to join domain namespace"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else /* ! HAVE_SETNS */
|
||||||
|
int virProcessGetNamespaces(pid_t pid,
|
||||||
|
size_t *nfdlist ATTRIBUTE_UNUSED,
|
||||||
|
int **fdlist ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
virReportSystemError(ENOSYS,
|
||||||
|
_("Cannot get namespaces for %llu"),
|
||||||
|
(unsigned long long)pid);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int virProcessSetNamespaces(size_t nfdlist ATTRIBUTE_UNUSED,
|
||||||
|
int *fdlist ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
virReportSystemError(ENOSYS, "%s",
|
||||||
|
_("Cannot set namespaces"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif /* ! HAVE_SETNS */
|
||||||
|
@ -47,4 +47,11 @@ int virProcessGetAffinity(pid_t pid,
|
|||||||
virBitmapPtr *map,
|
virBitmapPtr *map,
|
||||||
int maxcpu);
|
int maxcpu);
|
||||||
|
|
||||||
|
int virProcessGetNamespaces(pid_t pid,
|
||||||
|
size_t *nfdlist,
|
||||||
|
int **fdlist);
|
||||||
|
|
||||||
|
int virProcessSetNamespaces(size_t nfdlist,
|
||||||
|
int *fdlist);
|
||||||
|
|
||||||
#endif /* __VIR_PROCESS_H__ */
|
#endif /* __VIR_PROCESS_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user