mirror of
https://github.com/systemd/systemd
synced 2026-03-19 03:24:45 +01:00
Compare commits
7 Commits
ad64e3e8d6
...
798d7d0a8a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
798d7d0a8a | ||
|
|
aeffa4c3ed | ||
|
|
ca0176fa6b | ||
|
|
df49a7323a | ||
|
|
1cf4ed142d | ||
|
|
f4c48492fe | ||
|
|
bd5146c67e |
@ -1098,8 +1098,8 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
|
||||
<listitem>
|
||||
<para>Takes one of <literal>ipv4</literal>, <literal>ipv6</literal>,
|
||||
<literal>both</literal>, <literal>none</literal>. When <literal>ipv4</literal>,
|
||||
performs IPv4 Duplicate Address Detection. See
|
||||
<ulink url="https://tools.ietf.org/html/rfc5227">RFC 5224</ulink>.
|
||||
performs IPv4 Address Conflict Detection. See
|
||||
<ulink url="https://tools.ietf.org/html/rfc5227">RFC 5227</ulink>.
|
||||
When <literal>ipv6</literal>, performs IPv6 Duplicate Address Detection. See
|
||||
<ulink url="https://tools.ietf.org/html/rfc4862">RFC 4862</ulink>.
|
||||
Defaults to <literal>ipv6</literal>.</para>
|
||||
|
||||
@ -107,7 +107,7 @@ int device_set_devmode(sd_device *device, const char *devmode);
|
||||
int device_set_devname(sd_device *device, const char *devname);
|
||||
int device_set_devtype(sd_device *device, const char *devtype);
|
||||
int device_set_devnum(sd_device *device, const char *major, const char *minor);
|
||||
int device_set_subsystem(sd_device *device, const char *_subsystem);
|
||||
int device_set_subsystem(sd_device *device, const char *subsystem);
|
||||
int device_set_drivers_subsystem(sd_device *device);
|
||||
int device_set_driver(sd_device *device, const char *_driver);
|
||||
int device_set_driver(sd_device *device, const char *driver);
|
||||
int device_set_usec_initialized(sd_device *device, usec_t when);
|
||||
|
||||
@ -765,18 +765,15 @@ int device_shallow_clone(sd_device *old_device, sd_device **new_device) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (sd_device_get_subsystem(old_device, &val) >= 0) {
|
||||
r = device_set_subsystem(ret, val);
|
||||
(void) sd_device_get_subsystem(old_device, &val);
|
||||
r = device_set_subsystem(ret, val);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (streq_ptr(val, "drivers")) {
|
||||
r = free_and_strdup(&ret->driver_subsystem, old_device->driver_subsystem);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (streq(val, "drivers")) {
|
||||
ret->driver_subsystem = strdup(old_device->driver_subsystem);
|
||||
if (!ret->driver_subsystem)
|
||||
return -ENOMEM;
|
||||
}
|
||||
} else
|
||||
ret->subsystem_set = true;
|
||||
}
|
||||
|
||||
/* The device may be already removed. Let's copy minimal set of information to make
|
||||
* device_get_device_id() work without uevent file. */
|
||||
|
||||
@ -779,23 +779,24 @@ _public_ int sd_device_get_parent(sd_device *child, sd_device **ret) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int device_set_subsystem(sd_device *device, const char *_subsystem) {
|
||||
_cleanup_free_ char *subsystem = NULL;
|
||||
int device_set_subsystem(sd_device *device, const char *subsystem) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
int r;
|
||||
|
||||
assert(device);
|
||||
assert(_subsystem);
|
||||
|
||||
subsystem = strdup(_subsystem);
|
||||
if (!subsystem)
|
||||
return -ENOMEM;
|
||||
if (subsystem) {
|
||||
s = strdup(subsystem);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
r = device_add_property_internal(device, "SUBSYSTEM", subsystem);
|
||||
r = device_add_property_internal(device, "SUBSYSTEM", s);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
device->subsystem_set = true;
|
||||
return free_and_replace(device->subsystem, subsystem);
|
||||
return free_and_replace(device->subsystem, s);
|
||||
}
|
||||
|
||||
int device_set_drivers_subsystem(sd_device *device) {
|
||||
@ -956,23 +957,24 @@ _public_ int sd_device_get_devnum(sd_device *device, dev_t *devnum) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int device_set_driver(sd_device *device, const char *_driver) {
|
||||
_cleanup_free_ char *driver = NULL;
|
||||
int device_set_driver(sd_device *device, const char *driver) {
|
||||
_cleanup_free_ char *d = NULL;
|
||||
int r;
|
||||
|
||||
assert(device);
|
||||
assert(_driver);
|
||||
|
||||
driver = strdup(_driver);
|
||||
if (!driver)
|
||||
return -ENOMEM;
|
||||
if (driver) {
|
||||
d = strdup(driver);
|
||||
if (!d)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
r = device_add_property_internal(device, "DRIVER", driver);
|
||||
r = device_add_property_internal(device, "DRIVER", d);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
device->driver_set = true;
|
||||
return free_and_replace(device->driver, driver);
|
||||
return free_and_replace(device->driver, d);
|
||||
}
|
||||
|
||||
_public_ int sd_device_get_driver(sd_device *device, const char **ret) {
|
||||
@ -990,14 +992,14 @@ _public_ int sd_device_get_driver(sd_device *device, const char **ret) {
|
||||
|
||||
path = strjoina(syspath, "/driver");
|
||||
r = readlink_value(path, &driver);
|
||||
if (r >= 0) {
|
||||
r = device_set_driver(device, driver);
|
||||
if (r < 0)
|
||||
return log_device_debug_errno(device, r, "sd-device: Failed to set driver for %s: %m", device->devpath);
|
||||
} else if (r == -ENOENT)
|
||||
device->driver_set = true;
|
||||
else
|
||||
return log_device_debug_errno(device, r, "sd-device: Failed to set driver for %s: %m", device->devpath);
|
||||
if (r < 0 && r != -ENOENT)
|
||||
return log_device_debug_errno(device, r,
|
||||
"sd-device: readlink(\"%s\") failed: %m", path);
|
||||
|
||||
r = device_set_driver(device, driver);
|
||||
if (r < 0)
|
||||
return log_device_debug_errno(device, r,
|
||||
"sd-device: Failed to set driver \"%s\": %m", driver);
|
||||
}
|
||||
|
||||
if (!device->driver)
|
||||
|
||||
@ -2111,9 +2111,17 @@ static int address_section_verify(Address *address) {
|
||||
address->scope = RT_SCOPE_HOST;
|
||||
}
|
||||
|
||||
if (!FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV6))
|
||||
if (address->family == AF_INET6 &&
|
||||
!FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV6))
|
||||
address->flags |= IFA_F_NODAD;
|
||||
|
||||
if (address->family == AF_INET && in4_addr_is_link_local(&address->in_addr.in) &&
|
||||
!FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV4)) {
|
||||
log_debug("%s: An IPv4 link-local address is specified, enabling IPv4 Address Conflict Detection (ACD).",
|
||||
address->section->filename);
|
||||
address->duplicate_address_detection |= ADDRESS_FAMILY_IPV4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user