mirror of
https://github.com/systemd/systemd.git
synced 2025-03-28 02:50:16 +03:00
network/tuntap: code cleanups
- merge unnecessarily split functions, - drop unnecessary initializations, - tighten variable scopes, - introduce TUNTAP() helper function.
This commit is contained in:
parent
2720b6f23c
commit
8f388c4e46
@ -16,111 +16,88 @@
|
||||
|
||||
#define TUN_DEV "/dev/net/tun"
|
||||
|
||||
static int netdev_fill_tuntap_message(NetDev *netdev, struct ifreq *ifr) {
|
||||
TunTap *t;
|
||||
|
||||
static TunTap* TUNTAP(NetDev *netdev) {
|
||||
assert(netdev);
|
||||
assert(netdev->ifname);
|
||||
assert(ifr);
|
||||
|
||||
if (netdev->kind == NETDEV_KIND_TAP) {
|
||||
t = TAP(netdev);
|
||||
ifr->ifr_flags |= IFF_TAP;
|
||||
} else {
|
||||
t = TUN(netdev);
|
||||
ifr->ifr_flags |= IFF_TUN;
|
||||
switch (netdev->kind) {
|
||||
case NETDEV_KIND_TAP:
|
||||
return TAP(netdev);
|
||||
case NETDEV_KIND_TUN:
|
||||
return TUN(netdev);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!t->packet_info)
|
||||
ifr->ifr_flags |= IFF_NO_PI;
|
||||
|
||||
if (t->multi_queue)
|
||||
ifr->ifr_flags |= IFF_MULTI_QUEUE;
|
||||
|
||||
if (t->vnet_hdr)
|
||||
ifr->ifr_flags |= IFF_VNET_HDR;
|
||||
|
||||
strncpy(ifr->ifr_name, netdev->ifname, IFNAMSIZ-1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int netdev_tuntap_add(NetDev *netdev, struct ifreq *ifr) {
|
||||
static int netdev_create_tuntap(NetDev *netdev) {
|
||||
_cleanup_close_ int fd = -1;
|
||||
TunTap *t = NULL;
|
||||
const char *user;
|
||||
const char *group;
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
struct ifreq ifr = {};
|
||||
TunTap *t;
|
||||
int r;
|
||||
|
||||
assert(netdev);
|
||||
assert(ifr);
|
||||
t = TUNTAP(netdev);
|
||||
assert(t);
|
||||
|
||||
fd = open(TUN_DEV, O_RDWR|O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return log_netdev_error_errno(netdev, errno, "Failed to open tun dev: %m");
|
||||
|
||||
if (ioctl(fd, TUNSETIFF, ifr) < 0)
|
||||
return log_netdev_error_errno(netdev, errno, "TUNSETIFF failed on tun dev: %m");
|
||||
return log_netdev_error_errno(netdev, errno, "Failed to open " TUN_DEV ": %m");
|
||||
|
||||
if (netdev->kind == NETDEV_KIND_TAP)
|
||||
t = TAP(netdev);
|
||||
ifr.ifr_flags |= IFF_TAP;
|
||||
else
|
||||
t = TUN(netdev);
|
||||
ifr.ifr_flags |= IFF_TUN;
|
||||
|
||||
assert(t);
|
||||
if (!t->packet_info)
|
||||
ifr.ifr_flags |= IFF_NO_PI;
|
||||
|
||||
if (t->multi_queue)
|
||||
ifr.ifr_flags |= IFF_MULTI_QUEUE;
|
||||
|
||||
if (t->vnet_hdr)
|
||||
ifr.ifr_flags |= IFF_VNET_HDR;
|
||||
|
||||
strncpy(ifr.ifr_name, netdev->ifname, IFNAMSIZ-1);
|
||||
|
||||
if (ioctl(fd, TUNSETIFF, &ifr) < 0)
|
||||
return log_netdev_error_errno(netdev, errno, "TUNSETIFF failed: %m");
|
||||
|
||||
if (t->user_name) {
|
||||
user = t->user_name;
|
||||
const char *user = t->user_name;
|
||||
uid_t uid;
|
||||
|
||||
r = get_user_creds(&user, &uid, NULL, NULL, NULL, USER_CREDS_ALLOW_MISSING);
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Cannot resolve user name %s: %m", t->user_name);
|
||||
|
||||
if (ioctl(fd, TUNSETOWNER, uid) < 0)
|
||||
return log_netdev_error_errno(netdev, errno, "TUNSETOWNER failed on tun dev: %m");
|
||||
return log_netdev_error_errno(netdev, errno, "TUNSETOWNER failed: %m");
|
||||
}
|
||||
|
||||
if (t->group_name) {
|
||||
group = t->group_name;
|
||||
const char *group = t->group_name;
|
||||
gid_t gid;
|
||||
|
||||
r = get_group_creds(&group, &gid, USER_CREDS_ALLOW_MISSING);
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Cannot resolve group name %s: %m", t->group_name);
|
||||
|
||||
if (ioctl(fd, TUNSETGROUP, gid) < 0)
|
||||
return log_netdev_error_errno(netdev, errno, "TUNSETGROUP failed on tun dev: %m");
|
||||
return log_netdev_error_errno(netdev, errno, "TUNSETGROUP failed: %m");
|
||||
|
||||
}
|
||||
|
||||
if (ioctl(fd, TUNSETPERSIST, 1) < 0)
|
||||
return log_netdev_error_errno(netdev, errno, "TUNSETPERSIST failed on tun dev: %m");
|
||||
return log_netdev_error_errno(netdev, errno, "TUNSETPERSIST failed: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int netdev_create_tuntap(NetDev *netdev) {
|
||||
struct ifreq ifr = {};
|
||||
int r;
|
||||
|
||||
r = netdev_fill_tuntap_message(netdev, &ifr);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return netdev_tuntap_add(netdev, &ifr);
|
||||
}
|
||||
|
||||
static void tuntap_done(NetDev *netdev) {
|
||||
TunTap *t = NULL;
|
||||
TunTap *t;
|
||||
|
||||
assert(netdev);
|
||||
|
||||
if (netdev->kind == NETDEV_KIND_TUN)
|
||||
t = TUN(netdev);
|
||||
else
|
||||
t = TAP(netdev);
|
||||
|
||||
t = TUNTAP(netdev);
|
||||
assert(t);
|
||||
|
||||
t->user_name = mfree(t->user_name);
|
||||
|
Loading…
x
Reference in New Issue
Block a user