so_netns_cookie.c (1427B)
1// SPDX-License-Identifier: GPL-2.0 2#define _GNU_SOURCE 3#include <sched.h> 4#include <unistd.h> 5#include <stdio.h> 6#include <errno.h> 7#include <string.h> 8#include <stdlib.h> 9#include <stdint.h> 10#include <sys/types.h> 11#include <sys/socket.h> 12 13#ifndef SO_NETNS_COOKIE 14#define SO_NETNS_COOKIE 71 15#endif 16 17#define pr_err(fmt, ...) \ 18 ({ \ 19 fprintf(stderr, "%s:%d:" fmt ": %m\n", \ 20 __func__, __LINE__, ##__VA_ARGS__); \ 21 1; \ 22 }) 23 24int main(int argc, char *argvp[]) 25{ 26 uint64_t cookie1, cookie2; 27 socklen_t vallen; 28 int sock1, sock2; 29 30 sock1 = socket(AF_INET, SOCK_STREAM, 0); 31 if (sock1 < 0) 32 return pr_err("Unable to create TCP socket"); 33 34 vallen = sizeof(cookie1); 35 if (getsockopt(sock1, SOL_SOCKET, SO_NETNS_COOKIE, &cookie1, &vallen) != 0) 36 return pr_err("getsockopt(SOL_SOCKET, SO_NETNS_COOKIE)"); 37 38 if (!cookie1) 39 return pr_err("SO_NETNS_COOKIE returned zero cookie"); 40 41 if (unshare(CLONE_NEWNET)) 42 return pr_err("unshare"); 43 44 sock2 = socket(AF_INET, SOCK_STREAM, 0); 45 if (sock2 < 0) 46 return pr_err("Unable to create TCP socket"); 47 48 vallen = sizeof(cookie2); 49 if (getsockopt(sock2, SOL_SOCKET, SO_NETNS_COOKIE, &cookie2, &vallen) != 0) 50 return pr_err("getsockopt(SOL_SOCKET, SO_NETNS_COOKIE)"); 51 52 if (!cookie2) 53 return pr_err("SO_NETNS_COOKIE returned zero cookie"); 54 55 if (cookie1 == cookie2) 56 return pr_err("SO_NETNS_COOKIE returned identical cookies for distinct ns"); 57 58 close(sock1); 59 close(sock2); 60 return 0; 61}