diff --git a/include/sysctl.h b/include/sysctl.h index 3d7b182e8..610fbf6d6 100644 --- a/include/sysctl.h +++ b/include/sysctl.h @@ -5,6 +5,7 @@ struct sysctl_req { char *name; void *arg; int type; + int flags; }; extern int sysctl_op(struct sysctl_req *req, size_t nr_req, int op); @@ -30,4 +31,9 @@ enum { #define CTL_LEN(t) ((t) >> CTL_SHIFT) #define CTL_TYPE(t) ((t) & ((1 << CTL_SHIFT) - 1)) +/* + * Some entries might be missing mark them as optional. + */ +#define CTL_FLAGS_OPTIONAL 1 + #endif /* __CR_SYSCTL_H__ */ diff --git a/net.c b/net.c index 034793029..5d531d4ad 100644 --- a/net.c +++ b/net.c @@ -104,6 +104,7 @@ static int ipv4_conf_op(char *tgt, int *conf, int op, NetnsEntry **netns) req[ri].name = path[i]; req[ri].arg = &conf[i]; req[ri].type = CTL_32; + req[ri].flags = 0; ri++; } diff --git a/sysctl.c b/sysctl.c index 5c3a01f25..b0591408f 100644 --- a/sysctl.c +++ b/sysctl.c @@ -137,6 +137,8 @@ static int __sysctl_op(int dir, struct sysctl_req *req, int op) fd = openat(dir, req->name, flags); if (fd < 0) { + if (errno == ENOENT && (req->flags & CTL_FLAGS_OPTIONAL)) + return 0; pr_perror("Can't open sysctl %s", req->name); return -1; }