along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
-#include <sys/socket.h>
#include <net/if.h>
-#include <asm/types.h>
-#include <netinet/in.h>
-#include <string.h>
#include <stdlib.h>
-#include <unistd.h>
-#include "util.h"
-#include "macro.h"
-#include "loopback-setup.h"
-#include "socket-util.h"
#include "sd-rtnl.h"
#include "rtnl-util.h"
-
-/* this is hardcoded in the kernel, so don't look it up */
-#define LOOPBACK_IFINDEX 1
+#include "missing.h"
+#include "loopback-setup.h"
static int start_loopback(sd_rtnl *rtnl) {
_cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
return r;
r = start_loopback(rtnl);
- if (r == -EPERM) {
- if (!check_loopback(rtnl))
- return log_warning_errno(EPERM, "Failed to configure loopback device: %m");
- } else if (r < 0)
- return log_warning_errno(r, "Failed to configure loopback device: %m");
+ if (r < 0) {
+
+ /* If we lack the permissions to configure the
+ * loopback device, but we find it to be already
+ * configured, let's exit cleanly, in order to
+ * supported unprivileged containers. */
+ if (r == -EPERM && check_loopback(rtnl))
+ return 0;
+ return log_warning_errno(r, "Failed to configure loopback device: %m");
+ }
return 0;
}