mirror of
https://github.com/morgan9e/systemd
synced 2026-04-15 08:56:15 +09:00
Merge pull request #10992 from yuwata/follow-up-10948
network: make fib rule accept arbitrary ip protocol
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "hexdecoct.h"
|
||||
#include "hostname-util.h"
|
||||
#include "in-addr-util.h"
|
||||
#include "ip-protocol-list.h"
|
||||
#include "list.h"
|
||||
#include "locale-util.h"
|
||||
#include "mountpoint-util.h"
|
||||
@@ -25,7 +26,6 @@
|
||||
#include "rlimit-util.h"
|
||||
#include "securebits-util.h"
|
||||
#include "signal-util.h"
|
||||
#include "socket-protocol-list.h"
|
||||
#include "string-util.h"
|
||||
#include "syslog-util.h"
|
||||
#include "terminal-util.h"
|
||||
@@ -103,7 +103,7 @@ DEFINE_BUS_APPEND_PARSE("i", parse_errno);
|
||||
DEFINE_BUS_APPEND_PARSE("i", sched_policy_from_string);
|
||||
DEFINE_BUS_APPEND_PARSE("i", secure_bits_from_string);
|
||||
DEFINE_BUS_APPEND_PARSE("i", signal_from_string);
|
||||
DEFINE_BUS_APPEND_PARSE("i", socket_protocol_from_name);
|
||||
DEFINE_BUS_APPEND_PARSE("i", parse_ip_protocol);
|
||||
DEFINE_BUS_APPEND_PARSE_PTR("i", int32_t, int, ioprio_parse_priority);
|
||||
DEFINE_BUS_APPEND_PARSE_PTR("i", int32_t, int, parse_nice);
|
||||
DEFINE_BUS_APPEND_PARSE_PTR("i", int32_t, int, safe_atoi);
|
||||
@@ -1466,7 +1466,7 @@ static int bus_append_socket_property(sd_bus_message *m, const char *field, cons
|
||||
|
||||
if (streq(field, "SocketProtocol"))
|
||||
|
||||
return bus_append_socket_protocol_from_name(m, field, eq);
|
||||
return bus_append_parse_ip_protocol(m, field, eq);
|
||||
|
||||
if (STR_IN_SET(field,
|
||||
"ListenStream", "ListenDatagram", "ListenSequentialPacket", "ListenNetlink",
|
||||
|
||||
67
src/shared/ip-protocol-list.c
Normal file
67
src/shared/ip-protocol-list.c
Normal file
@@ -0,0 +1,67 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include <errno.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "ip-protocol-list.h"
|
||||
#include "parse-util.h"
|
||||
#include "string-util.h"
|
||||
#include "macro.h"
|
||||
|
||||
static const struct ip_protocol_name* lookup_ip_protocol(register const char *str, register GPERF_LEN_TYPE len);
|
||||
|
||||
#include "ip-protocol-from-name.h"
|
||||
#include "ip-protocol-to-name.h"
|
||||
|
||||
const char *ip_protocol_to_name(int id) {
|
||||
|
||||
if (id < 0)
|
||||
return NULL;
|
||||
|
||||
if ((size_t) id >= ELEMENTSOF(ip_protocol_names))
|
||||
return NULL;
|
||||
|
||||
return ip_protocol_names[id];
|
||||
}
|
||||
|
||||
int ip_protocol_from_name(const char *name) {
|
||||
const struct ip_protocol_name *sc;
|
||||
|
||||
assert(name);
|
||||
|
||||
sc = lookup_ip_protocol(name, strlen(name));
|
||||
if (!sc)
|
||||
return -EINVAL;
|
||||
|
||||
return sc->id;
|
||||
}
|
||||
|
||||
int parse_ip_protocol(const char *s) {
|
||||
_cleanup_free_ char *str = NULL;
|
||||
int i, r;
|
||||
|
||||
assert(s);
|
||||
|
||||
if (isempty(s))
|
||||
return IPPROTO_IP;
|
||||
|
||||
/* Do not use strdupa() here, as the input string may come from *
|
||||
* command line or config files. */
|
||||
str = strdup(s);
|
||||
if (!str)
|
||||
return -ENOMEM;
|
||||
|
||||
i = ip_protocol_from_name(ascii_strlower(str));
|
||||
if (i >= 0)
|
||||
return i;
|
||||
|
||||
r = safe_atoi(str, &i);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (!ip_protocol_to_name(i))
|
||||
return -EINVAL;
|
||||
|
||||
return i;
|
||||
}
|
||||
6
src/shared/ip-protocol-list.h
Normal file
6
src/shared/ip-protocol-list.h
Normal file
@@ -0,0 +1,6 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#pragma once
|
||||
|
||||
const char *ip_protocol_to_name(int id);
|
||||
int ip_protocol_from_name(const char *name);
|
||||
int parse_ip_protocol(const char *s);
|
||||
@@ -1,5 +1,5 @@
|
||||
BEGIN{
|
||||
print "static const char* const socket_protocol_names[] = { "
|
||||
print "static const char* const ip_protocol_names[] = { "
|
||||
}
|
||||
!/HOPOPTS/ {
|
||||
printf " [IPPROTO_%s] = \"%s\",\n", $1, tolower($1)
|
||||
@@ -129,8 +129,8 @@ shared_sources = files('''
|
||||
serialize.h
|
||||
sleep-config.c
|
||||
sleep-config.h
|
||||
socket-protocol-list.c
|
||||
socket-protocol-list.h
|
||||
ip-protocol-list.c
|
||||
ip-protocol-list.h
|
||||
spawn-ask-password-agent.c
|
||||
spawn-ask-password-agent.h
|
||||
spawn-polkit-agent.c
|
||||
@@ -192,44 +192,45 @@ if conf.get('HAVE_KMOD') == 1
|
||||
shared_sources += files('module-util.c')
|
||||
endif
|
||||
|
||||
generate_socket_protocol_list = find_program('generate-socket-protocol-list.sh')
|
||||
socket_protocol_list_txt = custom_target(
|
||||
'socket-protocol-list.txt',
|
||||
output : 'socket-protocol-list.txt',
|
||||
command : [generate_socket_protocol_list, cpp],
|
||||
generate_ip_protocol_list = find_program('generate-ip-protocol-list.sh')
|
||||
ip_protocol_list_txt = custom_target(
|
||||
'ip-protocol-list.txt',
|
||||
output : 'ip-protocol-list.txt',
|
||||
command : [generate_ip_protocol_list, cpp],
|
||||
capture : true)
|
||||
|
||||
fname = 'socket-protocol-from-name.gperf'
|
||||
fname = 'ip-protocol-from-name.gperf'
|
||||
gperf_file = custom_target(
|
||||
fname,
|
||||
input : socket_protocol_list_txt,
|
||||
input : ip_protocol_list_txt,
|
||||
output : fname,
|
||||
command : [generate_gperfs, 'socket_protocol', 'IPPROTO_', '@INPUT@'],
|
||||
command : [generate_gperfs, 'ip_protocol', 'IPPROTO_', '@INPUT@'],
|
||||
capture : true)
|
||||
|
||||
fname = 'socket-protocol-from-name.h'
|
||||
fname = 'ip-protocol-from-name.h'
|
||||
target1 = custom_target(
|
||||
fname,
|
||||
input : gperf_file,
|
||||
output : fname,
|
||||
command : [gperf,
|
||||
'-L', 'ANSI-C', '-t', '--ignore-case',
|
||||
'-N', 'lookup_socket_protocol',
|
||||
'-H', 'hash_socket_protocol_name',
|
||||
'-N', 'lookup_ip_protocol',
|
||||
'-H', 'hash_ip_protocol_name',
|
||||
'-p', '-C',
|
||||
'@INPUT@'],
|
||||
capture : true)
|
||||
|
||||
fname = 'socket-protocol-to-name.h'
|
||||
awkscript = 'socket-protocol-to-name.awk'
|
||||
fname = 'ip-protocol-to-name.h'
|
||||
awkscript = 'ip-protocol-to-name.awk'
|
||||
target2 = custom_target(
|
||||
fname,
|
||||
input : [awkscript, socket_protocol_list_txt],
|
||||
input : [awkscript, ip_protocol_list_txt],
|
||||
output : fname,
|
||||
command : [awk, '-f', '@INPUT0@', '@INPUT1@'],
|
||||
capture : true)
|
||||
|
||||
shared_sources += [target1, target2]
|
||||
shared_generated_gperf_headers = [target1, target2]
|
||||
shared_sources += shared_generated_gperf_headers
|
||||
|
||||
libshared_name = 'systemd-shared-@0@'.format(meson.project_version())
|
||||
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include <errno.h>
|
||||
#include <netinet/in.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "socket-protocol-list.h"
|
||||
#include "macro.h"
|
||||
|
||||
static const struct socket_protocol_name* lookup_socket_protocol(register const char *str, register GPERF_LEN_TYPE len);
|
||||
|
||||
#include "socket-protocol-from-name.h"
|
||||
#include "socket-protocol-to-name.h"
|
||||
|
||||
const char *socket_protocol_to_name(int id) {
|
||||
|
||||
if (id < 0)
|
||||
return NULL;
|
||||
|
||||
if (id >= (int) ELEMENTSOF(socket_protocol_names))
|
||||
return NULL;
|
||||
|
||||
return socket_protocol_names[id];
|
||||
}
|
||||
|
||||
int socket_protocol_from_name(const char *name) {
|
||||
const struct socket_protocol_name *sc;
|
||||
|
||||
assert(name);
|
||||
|
||||
sc = lookup_socket_protocol(name, strlen(name));
|
||||
if (!sc)
|
||||
return -EINVAL;
|
||||
|
||||
return sc->id;
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#pragma once
|
||||
|
||||
const char *socket_protocol_to_name(int id);
|
||||
int socket_protocol_from_name(const char *name);
|
||||
Reference in New Issue
Block a user