agetty: Watch only protocol requested by issue escapes

To decrease number of reloads, watch only protocol requested by \4 and \6
escapes in issue file.

Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
This commit is contained in:
Stanislav Brabec 2018-10-10 19:26:27 +02:00 committed by Karel Zak
parent c5955394a8
commit 36c55a8987
1 changed files with 14 additions and 5 deletions

View File

@ -153,6 +153,7 @@
# define AGETTY_RELOAD_FDNONE -2 /* uninitialized fd */ # define AGETTY_RELOAD_FDNONE -2 /* uninitialized fd */
static int inotify_fd = AGETTY_RELOAD_FDNONE; static int inotify_fd = AGETTY_RELOAD_FDNONE;
static int netlink_fd = AGETTY_RELOAD_FDNONE; static int netlink_fd = AGETTY_RELOAD_FDNONE;
static __u32 netlink_groups;
#endif #endif
/* /*
@ -1555,7 +1556,7 @@ static void open_netlink(void)
if (sock >= 0) { if (sock >= 0) {
addr.nl_family = AF_NETLINK; addr.nl_family = AF_NETLINK;
addr.nl_pid = getpid(); addr.nl_pid = getpid();
addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR; addr.nl_groups = netlink_groups;
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
close(sock); close(sock);
else else
@ -1738,6 +1739,9 @@ static void print_issue_file(struct options *op, struct termios *tp)
#ifdef ISSUEDIR_SUPPORT #ifdef ISSUEDIR_SUPPORT
int dd = -1, nfiles = 0, i; int dd = -1, nfiles = 0, i;
struct dirent **namelist = NULL; struct dirent **namelist = NULL;
#endif
#ifdef AGETTY_RELOAD
netlink_groups = 0;
#endif #endif
if ((op->flags & F_NONL) == 0) { if ((op->flags & F_NONL) == 0) {
/* Issue not in use, start with a new line. */ /* Issue not in use, start with a new line. */
@ -1829,6 +1833,10 @@ static void print_issue_file(struct options *op, struct termios *tp)
if (dd >= 0) if (dd >= 0)
close(dd); close(dd);
#endif #endif
#ifdef AGETTY_RELOAD
if (netlink_groups != 0)
open_netlink();
#endif
} }
#endif /* ISSUE_SUPPORT */ #endif /* ISSUE_SUPPORT */
@ -2633,10 +2641,6 @@ static void output_special_char(unsigned char c, struct options *op,
struct ifaddrs *addrs = NULL; struct ifaddrs *addrs = NULL;
char iface[128]; char iface[128];
#ifdef AGETTY_RELOAD
open_netlink();
#endif
if (getifaddrs(&addrs)) if (getifaddrs(&addrs))
break; break;
@ -2646,6 +2650,11 @@ static void output_special_char(unsigned char c, struct options *op,
output_iface_ip(addrs, NULL, family); output_iface_ip(addrs, NULL, family);
freeifaddrs(addrs); freeifaddrs(addrs);
if (c == '4')
netlink_groups |= RTMGRP_IPV4_IFADDR;
else
netlink_groups |= RTMGRP_IPV6_IFADDR;
break; break;
} }
default: default: