#define DBG(m, x) __UL_DBG(lsns, LSNS_DEBUG_, m, x)
#define ON_DBG(m, x) __UL_DBG_CALL(lsns, LSNS_DEBUG_, m, x)
+#define lsns_ioctl(fildes, request, ...) __extension__ ({ \
+ int ret = ioctl(fildes, request, ##__VA_ARGS__); \
+ if (ret == -1 && errno == ENOTTY) \
+ warnx("Unsupported ioctl %s", #request); \
+ ret; })
+
#define UL_DEBUG_CURRENT_MASK UL_DEBUG_MASK(lsns)
#include "debugobj.h"
+#define EXIT_UNSUPPORTED_IOCTL 2
+
static struct idcache *uid_cache = NULL;
/* column IDs */
if (fd < 0)
return -errno;
if (strcmp(nsname, "pid") == 0 || strcmp(nsname, "user") == 0) {
- if ((pfd = ioctl(fd, NS_GET_PARENT)) < 0) {
+ if ((pfd = lsns_ioctl(fd, NS_GET_PARENT)) < 0) {
if (errno == EPERM)
goto user;
close(fd);
close(pfd);
}
user:
- if ((ofd = ioctl(fd, NS_GET_USERNS)) < 0) {
+ if ((ofd = lsns_ioctl(fd, NS_GET_USERNS)) < 0) {
if (errno == EPERM)
goto out;
close(fd);
struct lsns_namespace *ns;
int clone_type, lsns_type;
- clone_type = ioctl(fd, NS_GET_NSTYPE);
+ clone_type = lsns_ioctl(fd, NS_GET_NSTYPE);
if (clone_type < 0)
return NULL;
lsns_type = clone_type_to_lsns_type(clone_type);
if (lsns_type < 0 || ls->fltr_types[lsns_type] == 0)
return NULL;
- fd_owner = ioctl(fd, NS_GET_USERNS);
+ fd_owner = lsns_ioctl(fd, NS_GET_USERNS);
if (fd_owner < 0)
goto parent;
if (fstat(fd_owner, &st_owner) < 0)
ino_owner = st_owner.st_ino;
parent:
- fd_parent = ioctl(fd, NS_GET_PARENT);
+ fd_parent = lsns_ioctl(fd, NS_GET_PARENT);
if (fd_parent < 0)
goto add_ns;
if (fstat(fd_parent, &st_parent) < 0)
add_ns:
ns = add_namespace(ls, lsns_type, ino, ino_parent, ino_owner);
- ioctl(fd, NS_GET_OWNER_UID, &ns->uid_fallback);
+ lsns_ioctl(fd, NS_GET_OWNER_UID, &ns->uid_fallback);
add_uid(uid_cache, ns->uid_fallback);
if ((lsns_type == LSNS_ID_USER || lsns_type == LSNS_ID_PID)
if (fd_orphan < 0)
return;
- fd_missing = ioctl(fd_orphan, cmd[rela]);
+ fd_missing = lsns_ioctl(fd_orphan, cmd[rela]);
close(fd_orphan);
if (fd_missing < 0)
return;
free_all(&ls);
- return r == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+ switch (r) {
+ case 0: return EXIT_SUCCESS;
+ case -ENOTTY: return EXIT_UNSUPPORTED_IOCTL;
+ default: return EXIT_FAILURE;
+ }
}