nsenter: add a macros to print errors
Signed-off-by: Andrey Vagin <avagin@openvz.org>
This commit is contained in:
parent
e77b238a83
commit
11b2dab1c5
|
@ -12,6 +12,8 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
#define pr_perror(fmt, ...) fprintf(stderr, "nsenter: " fmt ": %m\n", ##__VA_ARGS__)
|
||||||
|
|
||||||
// Use raw setns syscall for versions of glibc that don't include it (namely glibc-2.12)
|
// Use raw setns syscall for versions of glibc that don't include it (namely glibc-2.12)
|
||||||
#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 14
|
#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 14
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
@ -40,7 +42,7 @@ void nsexec()
|
||||||
pid = atoi(val);
|
pid = atoi(val);
|
||||||
snprintf(buf, sizeof(buf), "%d", pid);
|
snprintf(buf, sizeof(buf), "%d", pid);
|
||||||
if (strcmp(val, buf)) {
|
if (strcmp(val, buf)) {
|
||||||
fprintf(stderr, "Unable to parse _LIBCONTAINER_INITPID");
|
pr_perror("Unable to parse _LIBCONTAINER_INITPID");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,9 +50,7 @@ void nsexec()
|
||||||
snprintf(buf, PATH_MAX - 1, "/proc/%d/ns", pid);
|
snprintf(buf, PATH_MAX - 1, "/proc/%d/ns", pid);
|
||||||
tfd = open(buf, O_DIRECTORY | O_RDONLY);
|
tfd = open(buf, O_DIRECTORY | O_RDONLY);
|
||||||
if (tfd == -1) {
|
if (tfd == -1) {
|
||||||
fprintf(stderr,
|
pr_perror("Failed to open \"%s\"", buf);
|
||||||
"nsenter: Failed to open \"%s\" with error: \"%s\"\n",
|
|
||||||
buf, strerror(errno));
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,16 +67,12 @@ void nsexec()
|
||||||
|
|
||||||
fd = openat(tfd, namespaces[i], O_RDONLY);
|
fd = openat(tfd, namespaces[i], O_RDONLY);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
fprintf(stderr,
|
pr_perror("Failed to open ns file %s for ns %s", buf, namespaces[i]);
|
||||||
"nsenter: Failed to open ns file \"%s\" for ns \"%s\" with error: \"%s\"\n",
|
|
||||||
buf, namespaces[i], strerror(errno));
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
// Set the namespace.
|
// Set the namespace.
|
||||||
if (setns(fd, 0) == -1) {
|
if (setns(fd, 0) == -1) {
|
||||||
fprintf(stderr,
|
pr_perror("Failed to setns for %s", namespaces[i]);
|
||||||
"nsenter: Failed to setns for \"%s\" with error: \"%s\"\n",
|
|
||||||
namespaces[i], strerror(errno));
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
|
@ -84,7 +80,7 @@ void nsexec()
|
||||||
|
|
||||||
child = fork();
|
child = fork();
|
||||||
if (child < 0) {
|
if (child < 0) {
|
||||||
fprintf(stderr, "Unable to fork: %s", strerror(errno));
|
pr_perror("Unable to fork");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
// We must fork to actually enter the PID namespace.
|
// We must fork to actually enter the PID namespace.
|
||||||
|
@ -95,9 +91,7 @@ void nsexec()
|
||||||
// Parent, wait for the child.
|
// Parent, wait for the child.
|
||||||
int status = 0;
|
int status = 0;
|
||||||
if (waitpid(child, &status, 0) == -1) {
|
if (waitpid(child, &status, 0) == -1) {
|
||||||
fprintf(stderr,
|
pr_perror("Failed to waitpid");
|
||||||
"nsenter: Failed to waitpid with error: \"%s\"\n",
|
|
||||||
strerror(errno));
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
// Forward the child's exit code or re-send its death signal.
|
// Forward the child's exit code or re-send its death signal.
|
||||||
|
|
Loading…
Reference in New Issue