More patches

This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2014-10-13 10:21:01 -04:00
parent f1004dc2ae
commit db38be6409
13 changed files with 1247 additions and 0 deletions

View File

@ -0,0 +1,38 @@
From 547e849b722e597d70ba069e2cb8931317d66e00 Mon Sep 17 00:00:00 2001
From: Lukasz Skalski <l.skalski@samsung.com>
Date: Fri, 10 Oct 2014 16:42:19 +0200
Subject: [PATCH] bus-proxyd: fix compatibility with old dbus-1
'ListQueuedOwners' method should return 'NameHasNoOwner' error
if chosen name is not available on bus.
---
src/bus-proxyd/bus-proxyd.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/bus-proxyd/bus-proxyd.c b/src/bus-proxyd/bus-proxyd.c
index 4f44825679..52498f33d2 100644
--- a/src/bus-proxyd/bus-proxyd.c
+++ b/src/bus-proxyd/bus-proxyd.c
@@ -733,6 +733,7 @@ static int process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m) {
struct kdbus_cmd_free cmd_free;
struct kdbus_cmd_name *name;
_cleanup_strv_free_ char **owners = NULL;
+ _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
char *arg0;
int err = 0;
@@ -743,6 +744,14 @@ static int process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m) {
if (!service_name_is_valid(arg0))
return synthetic_reply_method_errno(m, -EINVAL, NULL);
+ r = sd_bus_get_owner(a, arg0, 0, NULL);
+ if (r == -ESRCH || r == -ENXIO) {
+ sd_bus_error_setf(&error, SD_BUS_ERROR_NAME_HAS_NO_OWNER, "Could not get owners of name '%s': no such name.", arg0);
+ return synthetic_reply_method_errno(m, r, &error);
+ }
+ if (r < 0)
+ return synthetic_reply_method_errno(m, r, NULL);
+
cmd.flags = KDBUS_NAME_LIST_QUEUED;
r = ioctl(a->input_fd, KDBUS_CMD_NAME_LIST, &cmd);
if (r < 0)

View File

@ -0,0 +1,26 @@
From 5482192e5774f52f2af0665a3b58539295e9c0a4 Mon Sep 17 00:00:00 2001
From: Michael Scherer <misc@zarb.org>
Date: Sat, 11 Oct 2014 04:13:43 -0400
Subject: [PATCH] Report aa_change_onexec error code
Since aa_change_onexec return the error code in errno, and return
-1, the current code do not give any useful information when
something fail. This make apparmor easier to debug, as seen on
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=760526
---
src/core/execute.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/core/execute.c b/src/core/execute.c
index 8b9bb27137..b165b33af0 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -1698,7 +1698,7 @@ static int exec_child(ExecCommand *command,
err = aa_change_onexec(context->apparmor_profile);
if (err < 0 && !context->apparmor_profile_ignore) {
*error = EXIT_APPARMOR_PROFILE;
- return err;
+ return -errno;
}
}
#endif

View File

@ -0,0 +1,636 @@
From 76253e73f9c9c24fec755e485516f3b55d0707b4 Mon Sep 17 00:00:00 2001
From: Dan Williams <dcbw@redhat.com>
Date: Wed, 8 Oct 2014 14:15:45 -0500
Subject: [PATCH] sd-dhcp-client: support non-Ethernet hardware addresses
Like Infiniband. See RFC 4390 section 2.1 for details on DHCP
and Infiniband; chaddr is zeroed, hlen is set to 0, and htype
is set to ARPHRD_INFINIBAND because IB hardware addresses
are 20 bytes in length.
---
src/libsystemd-network/dhcp-internal.h | 10 ++--
src/libsystemd-network/dhcp-network.c | 54 ++++++++++++++++++----
src/libsystemd-network/dhcp-packet.c | 8 ++--
src/libsystemd-network/sd-dhcp-client.c | 74 +++++++++++++++++++++++-------
src/libsystemd-network/sd-dhcp-server.c | 8 ++--
src/libsystemd-network/sd-dhcp6-client.c | 36 +++++++++++----
src/libsystemd-network/test-dhcp-client.c | 14 ++++--
src/libsystemd-network/test-dhcp-option.c | 2 +-
src/libsystemd-network/test-dhcp6-client.c | 8 +++-
src/network/networkd-dhcp4.c | 4 +-
src/network/networkd-link.c | 12 +++--
src/systemd/sd-dhcp-client.h | 4 +-
src/systemd/sd-dhcp6-client.h | 4 +-
13 files changed, 179 insertions(+), 59 deletions(-)
diff --git a/src/libsystemd-network/dhcp-internal.h b/src/libsystemd-network/dhcp-internal.h
index 1069c8a03b..d358a49307 100644
--- a/src/libsystemd-network/dhcp-internal.h
+++ b/src/libsystemd-network/dhcp-internal.h
@@ -24,6 +24,7 @@
#include <stdint.h>
#include <linux/if_packet.h>
+#include <net/if_arp.h>
#include <net/ethernet.h>
#include "socket-util.h"
@@ -31,7 +32,9 @@
#include "sd-dhcp-client.h"
#include "dhcp-protocol.h"
-int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link, uint32_t xid, struct ether_addr mac_addr);
+int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link,
+ uint32_t xid, const uint8_t *mac_addr,
+ size_t mac_addr_len, uint16_t arp_type);
int dhcp_network_bind_udp_socket(be32_t address, uint16_t port);
int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link,
const void *packet, size_t len);
@@ -47,8 +50,9 @@ typedef int (*dhcp_option_cb_t)(uint8_t code, uint8_t len,
int dhcp_option_parse(DHCPMessage *message, size_t len,
dhcp_option_cb_t cb, void *user_data);
-int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid, uint8_t type,
- size_t optlen, size_t *optoffset);
+int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid,
+ uint8_t type, uint16_t arp_type, size_t optlen,
+ size_t *optoffset);
uint16_t dhcp_packet_checksum(uint8_t *buf, size_t len);
diff --git a/src/libsystemd-network/dhcp-network.c b/src/libsystemd-network/dhcp-network.c
index 1ced5cf292..29e9993f66 100644
--- a/src/libsystemd-network/dhcp-network.c
+++ b/src/libsystemd-network/dhcp-network.c
@@ -22,6 +22,7 @@
#include <sys/socket.h>
#include <string.h>
#include <linux/if_packet.h>
+#include <linux/if_infiniband.h>
#include <net/ethernet.h>
#include <net/if_arp.h>
#include <stdio.h>
@@ -32,9 +33,12 @@
#include "dhcp-internal.h"
-int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link,
- uint32_t xid, struct ether_addr mac_addr) {
-
+static int _bind_raw_socket(int ifindex, union sockaddr_union *link,
+ uint32_t xid, const uint8_t *mac_addr,
+ size_t mac_addr_len,
+ const uint8_t *bcast_addr,
+ const struct ether_addr *eth_mac,
+ uint16_t arp_type, uint8_t dhcp_hlen) {
struct sock_filter filter[] = {
BPF_STMT(BPF_LD + BPF_W + BPF_LEN, 0), /* A <- packet length */
BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, sizeof(DHCPPacket), 1, 0), /* packet >= DHCPPacket ? */
@@ -57,21 +61,21 @@ int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link,
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, BOOTREPLY, 1, 0), /* op == BOOTREPLY ? */
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, dhcp.htype)), /* A <- DHCP header type */
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPHRD_ETHER, 1, 0), /* header type == ARPHRD_ETHER ? */
+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arp_type, 1, 0), /* header type == arp_type ? */
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, dhcp.hlen)), /* A <- mac address length */
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHER_ADDR_LEN, 1, 0), /* address length == ETHER_ADDR_LEN ? */
+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, dhcp_hlen, 1, 0), /* address length == dhcp_hlen ? */
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(DHCPPacket, dhcp.xid)), /* A <- client identifier */
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, xid, 1, 0), /* client identifier == xid ? */
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
- BPF_STMT(BPF_LD + BPF_IMM, htobe32(*((unsigned int *) &mac_addr))), /* A <- 4 bytes of client's MAC */
+ BPF_STMT(BPF_LD + BPF_IMM, htobe32(*((unsigned int *) eth_mac))), /* A <- 4 bytes of client's MAC */
BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(DHCPPacket, dhcp.chaddr)), /* A <- 4 bytes of MAC from dhcp.chaddr */
BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 1, 0), /* A == 0 ? */
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
- BPF_STMT(BPF_LD + BPF_IMM, htobe16(*((unsigned short *) (((char *) &mac_addr) + 4)))), /* A <- remainder of client's MAC */
+ BPF_STMT(BPF_LD + BPF_IMM, htobe16(*((unsigned short *) (((char *) eth_mac) + 4)))), /* A <- remainder of client's MAC */
BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */
BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(DHCPPacket, dhcp.chaddr) + 4), /* A <- remainder of MAC from dhcp.chaddr */
BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */
@@ -107,8 +111,9 @@ int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link,
link->ll.sll_family = AF_PACKET;
link->ll.sll_protocol = htons(ETH_P_IP);
link->ll.sll_ifindex = ifindex;
- link->ll.sll_halen = ETH_ALEN;
- memset(link->ll.sll_addr, 0xff, ETH_ALEN);
+ link->ll.sll_hatype = htons(arp_type);
+ link->ll.sll_halen = mac_addr_len;
+ memcpy(link->ll.sll_addr, bcast_addr, mac_addr_len);
r = bind(s, &link->sa, sizeof(link->ll));
if (r < 0)
@@ -120,6 +125,37 @@ int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link,
return r;
}
+int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link,
+ uint32_t xid, const uint8_t *mac_addr,
+ size_t mac_addr_len, uint16_t arp_type) {
+ static const uint8_t eth_bcast[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+ /* Default broadcast address for IPoIB */
+ static const uint8_t ib_bcast[] = {
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0x12, 0x40, 0x1b,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff
+ };
+ struct ether_addr eth_mac = { { 0, 0, 0, 0, 0, 0 } };
+ const uint8_t *bcast_addr = NULL;
+ uint8_t dhcp_hlen = 0;
+
+ assert_return(mac_addr_len > 0, -EINVAL);
+
+ if (arp_type == ARPHRD_ETHER) {
+ assert_return(mac_addr_len == ETH_ALEN, -EINVAL);
+ memcpy(&eth_mac, mac_addr, ETH_ALEN);
+ bcast_addr = eth_bcast;
+ dhcp_hlen = ETH_ALEN;
+ } else if (arp_type == ARPHRD_INFINIBAND) {
+ assert_return(mac_addr_len == INFINIBAND_ALEN, -EINVAL);
+ bcast_addr = ib_bcast;
+ } else
+ return -EINVAL;
+
+ return _bind_raw_socket(ifindex, link, xid, mac_addr, mac_addr_len,
+ bcast_addr, &eth_mac, arp_type, dhcp_hlen);
+}
+
int dhcp_network_bind_udp_socket(be32_t address, uint16_t port) {
union sockaddr_union src = {
.in.sin_family = AF_INET,
diff --git a/src/libsystemd-network/dhcp-packet.c b/src/libsystemd-network/dhcp-packet.c
index 9f850fdebb..7581daeeeb 100644
--- a/src/libsystemd-network/dhcp-packet.c
+++ b/src/libsystemd-network/dhcp-packet.c
@@ -38,15 +38,17 @@
#define DHCP_CLIENT_MIN_OPTIONS_SIZE 312
int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid,
- uint8_t type, size_t optlen, size_t *optoffset) {
+ uint8_t type, uint16_t arp_type, size_t optlen,
+ size_t *optoffset) {
size_t offset = 0;
int r;
assert(op == BOOTREQUEST || op == BOOTREPLY);
+ assert(arp_type == ARPHRD_ETHER || arp_type == ARPHRD_INFINIBAND);
message->op = op;
- message->htype = ARPHRD_ETHER;
- message->hlen = ETHER_ADDR_LEN;
+ message->htype = arp_type;
+ message->hlen = (arp_type == ARPHRD_ETHER) ? ETHER_ADDR_LEN : 0;
message->xid = htobe32(xid);
message->magic = htobe32(DHCP_MAGIC_COOKIE);
diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
index 2f94c16078..0eba4c379d 100644
--- a/src/libsystemd-network/sd-dhcp-client.c
+++ b/src/libsystemd-network/sd-dhcp-client.c
@@ -23,6 +23,7 @@
#include <stdio.h>
#include <net/ethernet.h>
#include <net/if_arp.h>
+#include <linux/if_infiniband.h>
#include <netinet/ether.h>
#include <sys/param.h>
#include <sys/ioctl.h>
@@ -37,6 +38,8 @@
#include "dhcp-lease-internal.h"
#include "sd-dhcp-client.h"
+#define MAX_MAC_ADDR_LEN INFINIBAND_ALEN
+
struct sd_dhcp_client {
RefCount n_ref;
@@ -57,6 +60,9 @@ struct sd_dhcp_client {
uint8_t type;
struct ether_addr mac_addr;
} _packed_ client_id;
+ uint8_t mac_addr[MAX_MAC_ADDR_LEN];
+ size_t mac_addr_len;
+ uint16_t arp_type;
char *hostname;
char *vendor_class_identifier;
uint32_t mtu;
@@ -163,15 +169,25 @@ int sd_dhcp_client_set_index(sd_dhcp_client *client, int interface_index) {
return 0;
}
-int sd_dhcp_client_set_mac(sd_dhcp_client *client,
- const struct ether_addr *addr) {
+int sd_dhcp_client_set_mac(sd_dhcp_client *client, const uint8_t *addr,
+ size_t addr_len, uint16_t arp_type) {
DHCP_CLIENT_DONT_DESTROY(client);
bool need_restart = false;
assert_return(client, -EINVAL);
assert_return(addr, -EINVAL);
+ assert_return(addr_len > 0 && addr_len <= MAX_MAC_ADDR_LEN, -EINVAL);
+ assert_return(arp_type > 0, -EINVAL);
+
+ if (arp_type == ARPHRD_ETHER)
+ assert_return(addr_len == ETH_ALEN, -EINVAL);
+ else if (arp_type == ARPHRD_INFINIBAND)
+ assert_return(addr_len == INFINIBAND_ALEN, -EINVAL);
+ else
+ return -EINVAL;
- if (memcmp(&client->client_id.mac_addr, addr, ETH_ALEN) == 0)
+ if (client->mac_addr_len == addr_len &&
+ memcmp(&client->mac_addr, addr, addr_len) == 0)
return 0;
if (!IN_SET(client->state, DHCP_STATE_INIT, DHCP_STATE_STOPPED)) {
@@ -181,6 +197,10 @@ int sd_dhcp_client_set_mac(sd_dhcp_client *client,
client_stop(client, DHCP_EVENT_STOP);
}
+ memcpy(&client->mac_addr, addr, addr_len);
+ client->mac_addr_len = addr_len;
+ client->arp_type = arp_type;
+
memcpy(&client->client_id.mac_addr, addr, ETH_ALEN);
client->client_id.type = 0x01;
@@ -318,7 +338,7 @@ static int client_message_init(sd_dhcp_client *client, DHCPPacket **ret,
return -ENOMEM;
r = dhcp_message_init(&packet->dhcp, BOOTREQUEST, client->xid, type,
- optlen, &optoffset);
+ client->arp_type, optlen, &optoffset);
if (r < 0)
return r;
@@ -337,14 +357,17 @@ static int client_message_init(sd_dhcp_client *client, DHCPPacket **ret,
Note: some interfaces needs this to be enabled, but some networks
needs this to be disabled as broadcasts are filteretd, so this
needs to be configurable */
- if (client->request_broadcast)
+ if (client->request_broadcast || client->arp_type != ARPHRD_ETHER)
packet->dhcp.flags = htobe16(0x8000);
/* RFC2132 section 4.1.1:
The client MUST include its hardware address in the chaddr field, if
- necessary for delivery of DHCP reply messages.
+ necessary for delivery of DHCP reply messages. Non-Ethernet
+ interfaces will leave 'chaddr' empty and use the client identifier
+ instead (eg, RFC 4390 section 2.1).
*/
- memcpy(&packet->dhcp.chaddr, &client->client_id.mac_addr, ETH_ALEN);
+ if (client->arp_type == ARPHRD_ETHER)
+ memcpy(&packet->dhcp.chaddr, &client->mac_addr, ETH_ALEN);
/* Some DHCP servers will refuse to issue an DHCP lease if the Client
Identifier option is not set */
@@ -843,7 +866,9 @@ static int client_start(sd_dhcp_client *client) {
client->xid = random_u32();
- r = dhcp_network_bind_raw_socket(client->index, &client->link, client->xid, client->client_id.mac_addr);
+ r = dhcp_network_bind_raw_socket(client->index, &client->link,
+ client->xid, client->mac_addr,
+ client->mac_addr_len, client->arp_type);
if (r < 0) {
client_stop(client, r);
return r;
@@ -887,7 +912,9 @@ static int client_timeout_t2(sd_event_source *s, uint64_t usec, void *userdata)
client->state = DHCP_STATE_REBINDING;
client->attempt = 1;
- r = dhcp_network_bind_raw_socket(client->index, &client->link, client->xid, client->client_id.mac_addr);
+ r = dhcp_network_bind_raw_socket(client->index, &client->link,
+ client->xid, client->mac_addr,
+ client->mac_addr_len, client->arp_type);
if (r < 0) {
client_stop(client, r);
return 0;
@@ -1331,6 +1358,9 @@ static int client_receive_message_udp(sd_event_source *s, int fd,
sd_dhcp_client *client = userdata;
_cleanup_free_ DHCPMessage *message = NULL;
int buflen = 0, len, r;
+ const struct ether_addr zero_mac = { { 0, 0, 0, 0, 0, 0 } };
+ const struct ether_addr *expected_chaddr = NULL;
+ uint8_t expected_hlen = 0;
assert(s);
assert(client);
@@ -1367,13 +1397,26 @@ static int client_receive_message_udp(sd_event_source *s, int fd,
return 0;
}
- if (message->htype != ARPHRD_ETHER || message->hlen != ETHER_ADDR_LEN) {
- log_dhcp_client(client, "not an ethernet packet");
+ if (message->htype != client->arp_type) {
+ log_dhcp_client(client, "packet type does not match client type");
+ return 0;
+ }
+
+ if (client->arp_type == ARPHRD_ETHER) {
+ expected_hlen = ETH_ALEN;
+ expected_chaddr = (const struct ether_addr *) &client->mac_addr;
+ } else {
+ /* Non-ethernet links expect zero chaddr */
+ expected_hlen = 0;
+ expected_chaddr = &zero_mac;
+ }
+
+ if (message->hlen != expected_hlen) {
+ log_dhcp_client(client, "unexpected packet hlen %d", message->hlen);
return 0;
}
- if (memcmp(&message->chaddr[0], &client->client_id.mac_addr,
- ETH_ALEN)) {
+ if (memcmp(&message->chaddr[0], expected_chaddr, ETH_ALEN)) {
log_dhcp_client(client, "received chaddr does not match "
"expected: ignoring");
return 0;
@@ -1455,7 +1498,6 @@ static int client_receive_message_raw(sd_event_source *s, int fd,
}
int sd_dhcp_client_start(sd_dhcp_client *client) {
- char buffer[ETHER_ADDR_TO_STRING_MAX];
int r;
assert_return(client, -EINVAL);
@@ -1469,9 +1511,7 @@ int sd_dhcp_client_start(sd_dhcp_client *client) {
r = client_start(client);
if (r >= 0)
- log_dhcp_client(client, "STARTED on ifindex %u with address %s",
- client->index,
- ether_addr_to_string(&client->client_id.mac_addr, buffer));
+ log_dhcp_client(client, "STARTED on ifindex %u", client->index);
return r;
}
diff --git a/src/libsystemd-network/sd-dhcp-server.c b/src/libsystemd-network/sd-dhcp-server.c
index a6d6178e72..24fedd2375 100644
--- a/src/libsystemd-network/sd-dhcp-server.c
+++ b/src/libsystemd-network/sd-dhcp-server.c
@@ -392,8 +392,8 @@ static int server_message_init(sd_dhcp_server *server, DHCPPacket **ret,
return -ENOMEM;
r = dhcp_message_init(&packet->dhcp, BOOTREPLY,
- be32toh(req->message->xid), type, req->max_optlen,
- &optoffset);
+ be32toh(req->message->xid), type, ARPHRD_ETHER,
+ req->max_optlen, &optoffset);
if (r < 0)
return r;
@@ -513,8 +513,8 @@ static int server_send_forcerenew(sd_dhcp_server *server, be32_t address,
return -ENOMEM;
r = dhcp_message_init(&packet->dhcp, BOOTREPLY, 0,
- DHCP_FORCERENEW, DHCP_MIN_OPTIONS_SIZE,
- &optoffset);
+ DHCP_FORCERENEW, ARPHRD_ETHER,
+ DHCP_MIN_OPTIONS_SIZE, &optoffset);
if (r < 0)
return r;
diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c
index 6ea68c915f..fa4f9b5dc2 100644
--- a/src/libsystemd-network/sd-dhcp6-client.c
+++ b/src/libsystemd-network/sd-dhcp6-client.c
@@ -22,6 +22,7 @@
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>
+#include <linux/if_infiniband.h>
#include "udev.h"
#include "udev-util.h"
@@ -44,6 +45,8 @@
*/
#define MAX_DUID_LEN 128
+#define MAX_MAC_ADDR_LEN INFINIBAND_ALEN
+
struct sd_dhcp6_client {
RefCount n_ref;
@@ -51,7 +54,9 @@ struct sd_dhcp6_client {
sd_event *event;
int event_priority;
int index;
- struct ether_addr mac_addr;
+ uint8_t mac_addr[MAX_MAC_ADDR_LEN];
+ size_t mac_addr_len;
+ uint16_t arp_type;
DHCP6IA ia_na;
be32_t transaction_id;
usec_t transaction_start;
@@ -160,15 +165,28 @@ int sd_dhcp6_client_set_index(sd_dhcp6_client *client, int interface_index)
return 0;
}
-int sd_dhcp6_client_set_mac(sd_dhcp6_client *client,
- const struct ether_addr *mac_addr)
+int sd_dhcp6_client_set_mac(sd_dhcp6_client *client, const uint8_t *addr,
+ size_t addr_len, uint16_t arp_type)
{
assert_return(client, -EINVAL);
-
- if (mac_addr)
- memcpy(&client->mac_addr, mac_addr, sizeof(client->mac_addr));
+ assert_return(addr, -EINVAL);
+ assert_return(addr_len > 0 && addr_len <= MAX_MAC_ADDR_LEN, -EINVAL);
+ assert_return(arp_type > 0, -EINVAL);
+
+ if (arp_type == ARPHRD_ETHER)
+ assert_return(addr_len == ETH_ALEN, -EINVAL);
+ else if (arp_type == ARPHRD_INFINIBAND)
+ assert_return(addr_len == INFINIBAND_ALEN, -EINVAL);
else
- memset(&client->mac_addr, 0x00, sizeof(client->mac_addr));
+ return -EINVAL;
+
+ if (client->mac_addr_len == addr_len &&
+ memcmp(&client->mac_addr, addr, addr_len) == 0)
+ return 0;
+
+ memcpy(&client->mac_addr, addr, addr_len);
+ client->mac_addr_len = addr_len;
+ client->arp_type = arp_type;
return 0;
}
@@ -646,8 +664,8 @@ static int client_ensure_iaid(sd_dhcp6_client *client) {
siphash24((uint8_t*)&id, name, strlen(name), HASH_KEY.bytes);
else
/* fall back to mac address if no predictable name available */
- siphash24((uint8_t*)&id, &client->mac_addr, ETH_ALEN,
- HASH_KEY.bytes);
+ siphash24((uint8_t*)&id, &client->mac_addr,
+ client->mac_addr_len, HASH_KEY.bytes);
/* fold into 32 bits */
client->ia_na.id = (id & 0xffffffff) ^ (id >> 32);
diff --git a/src/libsystemd-network/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c
index c48aa04b8d..7dab97de2f 100644
--- a/src/libsystemd-network/test-dhcp-client.c
+++ b/src/libsystemd-network/test-dhcp-client.c
@@ -196,7 +196,9 @@ int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link,
return 575;
}
-int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link, uint32_t id, struct ether_addr mac)
+int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link,
+ uint32_t id, const uint8_t *addr,
+ size_t addr_len, uint16_t arp_type)
{
if (socketpair(AF_UNIX, SOCK_STREAM, 0, test_fd) < 0)
return -errno;
@@ -244,7 +246,10 @@ static void test_discover_message(sd_event *e)
assert_se(r >= 0);
assert_se(sd_dhcp_client_set_index(client, 42) >= 0);
- assert_se(sd_dhcp_client_set_mac(client, &mac_addr) >= 0);
+ assert_se(sd_dhcp_client_set_mac(client,
+ (const uint8_t *) &mac_addr,
+ sizeof (mac_addr),
+ ARPHRD_ETHER) >= 0);
assert_se(sd_dhcp_client_set_request_option(client, 248) >= 0);
@@ -462,7 +467,10 @@ static void test_addr_acq(sd_event *e) {
assert_se(r >= 0);
assert_se(sd_dhcp_client_set_index(client, 42) >= 0);
- assert_se(sd_dhcp_client_set_mac(client, &mac_addr) >= 0);
+ assert_se(sd_dhcp_client_set_mac(client,
+ (const uint8_t *) &mac_addr,
+ sizeof (mac_addr),
+ ARPHRD_ETHER) >= 0);
assert_se(sd_dhcp_client_set_callback(client, test_addr_acq_acquired, e)
>= 0);
diff --git a/src/libsystemd-network/test-dhcp-option.c b/src/libsystemd-network/test-dhcp-option.c
index 63cdc7aa06..eac3844f96 100644
--- a/src/libsystemd-network/test-dhcp-option.c
+++ b/src/libsystemd-network/test-dhcp-option.c
@@ -92,7 +92,7 @@ static void test_message_init(void)
message = malloc0(len);
assert_se(dhcp_message_init(message, BOOTREQUEST, 0x12345678,
- DHCP_DISCOVER, optlen, &optoffset) >= 0);
+ DHCP_DISCOVER, ARPHRD_ETHER, optlen, &optoffset) >= 0);
assert_se(message->xid == htobe32(0x12345678));
assert_se(message->op == BOOTREQUEST);
diff --git a/src/libsystemd-network/test-dhcp6-client.c b/src/libsystemd-network/test-dhcp6-client.c
index 37ddfc2cfa..26b28a20e8 100644
--- a/src/libsystemd-network/test-dhcp6-client.c
+++ b/src/libsystemd-network/test-dhcp6-client.c
@@ -66,7 +66,9 @@ static int test_client_basic(sd_event *e) {
assert_se(sd_dhcp6_client_set_index(client, -1) == 0);
assert_se(sd_dhcp6_client_set_index(client, 42) >= 0);
- assert_se(sd_dhcp6_client_set_mac(client, &mac_addr) >= 0);
+ assert_se(sd_dhcp6_client_set_mac(client, (const uint8_t *) &mac_addr,
+ sizeof (mac_addr),
+ ARPHRD_ETHER) >= 0);
assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_CLIENTID) == -EINVAL);
assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_DNS_SERVERS) == -EEXIST);
@@ -572,7 +574,9 @@ static int test_client_solicit(sd_event *e) {
assert_se(sd_dhcp6_client_attach_event(client, e, 0) >= 0);
assert_se(sd_dhcp6_client_set_index(client, test_index) == 0);
- assert_se(sd_dhcp6_client_set_mac(client, &mac_addr) >= 0);
+ assert_se(sd_dhcp6_client_set_mac(client, (const uint8_t *) &mac_addr,
+ sizeof (mac_addr),
+ ARPHRD_ETHER) >= 0);
assert_se(sd_dhcp6_client_set_callback(client,
test_client_solicit_cb, e) >= 0);
diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c
index e451af8643..63bfa86f99 100644
--- a/src/network/networkd-dhcp4.c
+++ b/src/network/networkd-dhcp4.c
@@ -599,7 +599,9 @@ int dhcp4_configure(Link *link) {
if (r < 0)
return r;
- r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
+ r = sd_dhcp_client_set_mac(link->dhcp_client,
+ (const uint8_t *) &link->mac,
+ sizeof (link->mac), ARPHRD_ETHER);
if (r < 0)
return r;
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index dcbe38a90a..c6e173fbc6 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -909,7 +909,9 @@ static void icmp6_router_handler(sd_icmp6_nd *nd, int event, void *userdata) {
return;
}
- r = sd_dhcp6_client_set_mac(link->dhcp6_client, &link->mac);
+ r = sd_dhcp6_client_set_mac(link->dhcp6_client,
+ (const uint8_t *) &link->mac,
+ sizeof (link->mac), ARPHRD_ETHER);
if (r < 0) {
link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
return;
@@ -1647,7 +1649,9 @@ int link_update(Link *link, sd_rtnl_message *m) {
if (link->dhcp_client) {
r = sd_dhcp_client_set_mac(link->dhcp_client,
- &link->mac);
+ (const uint8_t *) &link->mac,
+ sizeof (link->mac),
+ ARPHRD_ETHER);
if (r < 0) {
log_warning_link(link,
"Could not update MAC address in DHCP client: %s",
@@ -1658,7 +1662,9 @@ int link_update(Link *link, sd_rtnl_message *m) {
if (link->dhcp6_client) {
r = sd_dhcp6_client_set_mac(link->dhcp6_client,
- &link->mac);
+ (const uint8_t *) &link->mac,
+ sizeof (link->mac),
+ ARPHRD_ETHER);
if (r < 0) {
log_warning_link(link,
"Could not update MAC address in DHCPv6 client: %s",
diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h
index 98c67829b7..7416f82193 100644
--- a/src/systemd/sd-dhcp-client.h
+++ b/src/systemd/sd-dhcp-client.h
@@ -49,8 +49,8 @@ int sd_dhcp_client_set_request_address(sd_dhcp_client *client,
const struct in_addr *last_address);
int sd_dhcp_client_set_request_broadcast(sd_dhcp_client *client, int broadcast);
int sd_dhcp_client_set_index(sd_dhcp_client *client, int interface_index);
-int sd_dhcp_client_set_mac(sd_dhcp_client *client,
- const struct ether_addr *addr);
+int sd_dhcp_client_set_mac(sd_dhcp_client *client, const uint8_t *addr,
+ size_t addr_len, uint16_t arp_type);
int sd_dhcp_client_set_mtu(sd_dhcp_client *client, uint32_t mtu);
int sd_dhcp_client_set_hostname(sd_dhcp_client *client, const char *hostname);
int sd_dhcp_client_set_vendor_class_identifier(sd_dhcp_client *client, const char *vci);
diff --git a/src/systemd/sd-dhcp6-client.h b/src/systemd/sd-dhcp6-client.h
index a4409e8d4e..c7f168fe21 100644
--- a/src/systemd/sd-dhcp6-client.h
+++ b/src/systemd/sd-dhcp6-client.h
@@ -43,8 +43,8 @@ int sd_dhcp6_client_set_callback(sd_dhcp6_client *client,
sd_dhcp6_client_cb_t cb, void *userdata);
int sd_dhcp6_client_set_index(sd_dhcp6_client *client, int interface_index);
-int sd_dhcp6_client_set_mac(sd_dhcp6_client *client,
- const struct ether_addr *mac_addr);
+int sd_dhcp6_client_set_mac(sd_dhcp6_client *client, const uint8_t *addr,
+ size_t addr_len, uint16_t arp_type);
int sd_dhcp6_client_set_duid(sd_dhcp6_client *client, uint16_t type, uint8_t *duid,
size_t duid_len);
int sd_dhcp6_client_set_request_option(sd_dhcp6_client *client,

View File

@ -0,0 +1,46 @@
From f08f302732c0597c83ec6b8022aa82faffb116f9 Mon Sep 17 00:00:00 2001
From: David Herrmann <dh.herrmann@gmail.com>
Date: Sat, 11 Oct 2014 18:49:20 +0200
Subject: [PATCH] terminal/grdrm: force deep modeset on enter
Usually, when our session is activated (or re-configurated) we should be
able to try a page-flip to our buffer. The kernel driver should reject it
if it is incompatible. As it turns out, drivers don't do this. Therefore,
we now force a deep modeset if we're not sure what mode is set.
This has the side-effect that we might get glitches on session-switches
(depending on driver behavior). However, there's no way around this and it
is what everyone does so far. Most drivers still detect if we keep the
mode and so don't touch the clocks. Therefore, we just get a regular async
flip.
---
src/libsystemd-terminal/grdev-drm.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/libsystemd-terminal/grdev-drm.c b/src/libsystemd-terminal/grdev-drm.c
index 232321c0e2..dba6db2691 100644
--- a/src/libsystemd-terminal/grdev-drm.c
+++ b/src/libsystemd-terminal/grdev-drm.c
@@ -1158,8 +1158,21 @@ static int grdrm_crtc_commit_flip(grdrm_crtc *crtc, grdev_fb *basefb) {
assert(basefb);
assert(pipe);
- if (!crtc->applied && !grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode))
+ if (!crtc->applied) {
+ if (!grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode))
+ return 0;
+
+ /* TODO: Theoretically, we should be able to page-flip to our
+ * framebuffer here. We didn't perform any deep modeset, but the
+ * DRM driver is really supposed to reject our page-flip in case
+ * the FB is not compatible. We then properly fall back to a
+ * deep modeset.
+ * As it turns out, drivers don't to this. Therefore, we need to
+ * perform a full modeset on enter now. We might avoid this in
+ * the future with fixed drivers.. */
+
return 0;
+ }
fb = fb_from_base(basefb);

View File

@ -0,0 +1,31 @@
From 4623e36006c1428e876c9a326b43f713cfec658e Mon Sep 17 00:00:00 2001
From: David Herrmann <dh.herrmann@gmail.com>
Date: Sat, 11 Oct 2014 18:53:26 +0200
Subject: [PATCH] NEWS: don't mention noinst_* debug programs
systemd-evcat and systemd-modeset are not installed systemd wide and
should really just be used by developers to test the libsystemd-terminal
features. No reason to mention it in NEWS.. despite the undulating
rainbows..
---
NEWS | 7 -------
1 file changed, 7 deletions(-)
diff --git a/NEWS b/NEWS
index 6d93787bf8..c18ceaac5e 100644
--- a/NEWS
+++ b/NEWS
@@ -37,13 +37,6 @@ CHANGES WITH 217:
generator will parse the resume= option on the kernel
command-line to trigger resume.
- * systemd-evcat input debugging tool has been added. It will
- print keys read for the input system and show modifier
- status.
-
- * systemd-modeset graphics debugging tool will show undulating
- rainbows on all connected displays.
-
* A user console daemon systemd-consoled has been added. It is
a preview, and will so far open a single terminal on each
session of the user marked as Desktop=SYSTEMD-CONSOLE.

90
0583-Modernization.patch Normal file
View File

@ -0,0 +1,90 @@
From b1389b0d0805392570085acc7cb10eafcf885405 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Date: Sat, 11 Oct 2014 11:37:37 -0400
Subject: [PATCH] Modernization
---
src/core/load-fragment.c | 14 ++++++--------
src/journal/journald-server.c | 5 ++---
2 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index 0620882b4e..6b6f9908b5 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -288,7 +288,8 @@ int config_parse_socket_listen(const char *unit,
void *data,
void *userdata) {
- SocketPort *p, *tail;
+ _cleanup_free_ SocketPort *p = NULL;
+ SocketPort *tail;
Socket *s;
int r;
@@ -315,10 +316,9 @@ int config_parse_socket_listen(const char *unit,
r = unit_full_printf(UNIT(s), rvalue, &p->path);
if (r < 0) {
p->path = strdup(rvalue);
- if (!p->path) {
- free(p);
+ if (!p->path)
return log_oom();
- } else
+ else
log_syntax(unit, LOG_ERR, filename, line, -r,
"Failed to resolve unit specifiers on %s, ignoring: %s", rvalue, strerror(-r));
}
@@ -334,11 +334,10 @@ int config_parse_socket_listen(const char *unit,
log_syntax(unit, LOG_ERR, filename, line, -r,
"Failed to resolve unit specifiers on %s, ignoring: %s", rvalue, strerror(-r));
- r = socket_address_parse_netlink(&p->address, k ? k : rvalue);
+ r = socket_address_parse_netlink(&p->address, k ?: rvalue);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, -r,
"Failed to parse address value, ignoring: %s", rvalue);
- free(p);
return 0;
}
@@ -355,7 +354,6 @@ int config_parse_socket_listen(const char *unit,
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, -r,
"Failed to parse address value, ignoring: %s", rvalue);
- free(p);
return 0;
}
@@ -371,7 +369,6 @@ int config_parse_socket_listen(const char *unit,
if (socket_address_family(&p->address) != AF_LOCAL && p->address.type == SOCK_SEQPACKET) {
log_syntax(unit, LOG_ERR, filename, line, ENOTSUP,
"Address family not supported, ignoring: %s", rvalue);
- free(p);
return 0;
}
}
@@ -384,6 +381,7 @@ int config_parse_socket_listen(const char *unit,
LIST_INSERT_AFTER(port, s->ports, tail, p);
} else
LIST_PREPEND(port, s->ports, p);
+ p = NULL;
return 0;
}
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
index 3df7416397..52111f75a0 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
@@ -1475,9 +1475,8 @@ int server_init(Server *s) {
server_parse_config_file(s);
server_parse_proc_cmdline(s);
if (!!s->rate_limit_interval ^ !!s->rate_limit_burst) {
- log_debug("Setting both rate limit interval and burst from %llu,%u to 0,0",
- (long long unsigned) s->rate_limit_interval,
- s->rate_limit_burst);
+ log_debug("Setting both rate limit interval and burst from "USEC_FMT",%u to 0,0",
+ s->rate_limit_interval, s->rate_limit_burst);
s->rate_limit_interval = s->rate_limit_burst = 0;
}

View File

@ -0,0 +1,108 @@
From a158dbf156acc8899806fe07daa295464e82b52b Mon Sep 17 00:00:00 2001
From: Brandon L Black <blblack@gmail.com>
Date: Sat, 11 Oct 2014 23:36:06 +0000
Subject: [PATCH] Set $NOTIFY_SOCKET for control procs if NotifyAccess=all
---
TODO | 2 --
src/core/service.c | 11 +----------
2 files changed, 1 insertion(+), 12 deletions(-)
diff --git a/TODO b/TODO
index 69ed60eaff..05a61a3953 100644
--- a/TODO
+++ b/TODO
@@ -167,8 +167,6 @@ Features:
* journalctl: add the ability to look for the most recent process of a binary. journalctl /usr/bin/X11 --pid=-1 or so...
-* set NOTIFY_SOCKET also for control processes
-
* mount_cgroup_controllers(): symlinks need to get the label applied
* For timer units: add some mechanisms so that timer units that trigger immediately on boot do not have the services
diff --git a/src/core/service.c b/src/core/service.c
index f551061366..76763441b0 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -883,7 +883,6 @@ static int service_spawn(
bool apply_permissions,
bool apply_chroot,
bool apply_tty_stdin,
- bool set_notify_socket,
bool is_control,
pid_t *_pid) {
@@ -948,7 +947,7 @@ static int service_spawn(
goto fail;
}
- if (set_notify_socket)
+ if (is_control ? s->notify_access == NOTIFY_ALL : s->notify_access != NOTIFY_NONE)
if (asprintf(our_env + n_env++, "NOTIFY_SOCKET=%s", UNIT(s)->manager->notify_socket) < 0) {
r = -ENOMEM;
goto fail;
@@ -1153,7 +1152,6 @@ static void service_enter_stop_post(Service *s, ServiceResult f) {
!s->permissions_start_only,
!s->root_directory_start_only,
true,
- false,
true,
&s->control_pid);
if (r < 0)
@@ -1253,7 +1251,6 @@ static void service_enter_stop(Service *s, ServiceResult f) {
!s->permissions_start_only,
!s->root_directory_start_only,
false,
- false,
true,
&s->control_pid);
if (r < 0)
@@ -1316,7 +1313,6 @@ static void service_enter_start_post(Service *s) {
!s->permissions_start_only,
!s->root_directory_start_only,
false,
- false,
true,
&s->control_pid);
if (r < 0)
@@ -1383,7 +1379,6 @@ static void service_enter_start(Service *s) {
true,
true,
true,
- s->notify_access != NOTIFY_NONE,
false,
&pid);
if (r < 0)
@@ -1449,7 +1444,6 @@ static void service_enter_start_pre(Service *s) {
!s->permissions_start_only,
!s->root_directory_start_only,
true,
- false,
true,
&s->control_pid);
if (r < 0)
@@ -1530,7 +1524,6 @@ static void service_enter_reload(Service *s) {
!s->permissions_start_only,
!s->root_directory_start_only,
false,
- false,
true,
&s->control_pid);
if (r < 0)
@@ -1568,7 +1561,6 @@ static void service_run_next_control(Service *s) {
!s->root_directory_start_only,
s->control_command_id == SERVICE_EXEC_START_PRE ||
s->control_command_id == SERVICE_EXEC_STOP_POST,
- false,
true,
&s->control_pid);
if (r < 0)
@@ -1611,7 +1603,6 @@ static void service_run_next_main(Service *s) {
true,
true,
true,
- s->notify_access != NOTIFY_NONE,
false,
&pid);
if (r < 0)

View File

@ -0,0 +1,98 @@
From 8d1d1bf20a1a6175decff979f6b95d831e0b3fc8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Date: Sun, 12 Oct 2014 16:05:49 -0400
Subject: [PATCH] tests: fix some tests to pass in koji
FAIL: test-engine
=================
Cannot find cgroup mount point: No such file or directory
Assertion 'r >= 0' failed at ../src/test/test-engine.c:46, function main(). Aborting.
FAIL: test-sched-prio
=====================
Cannot find cgroup mount point: No such file or directory
Assertion 'r >= 0' failed at ../src/test/test-sched-prio.c:42, function main(). Aborting.
FAIL: test-bus-cleanup
======================
Assertion 'sd_bus_open_system(&bus) >= 0' failed at ../src/libsystemd/sd-bus/test-bus-cleanup.c:40, function test_bus_open(). Aborting.
after new: refcount 1
---
src/libsystemd/sd-bus/test-bus-cleanup.c | 22 +++++++++++++++++++---
src/test/test-engine.c | 2 +-
src/test/test-sched-prio.c | 2 +-
3 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/src/libsystemd/sd-bus/test-bus-cleanup.c b/src/libsystemd/sd-bus/test-bus-cleanup.c
index e36a69f0d1..f586880593 100644
--- a/src/libsystemd/sd-bus/test-bus-cleanup.c
+++ b/src/libsystemd/sd-bus/test-bus-cleanup.c
@@ -34,11 +34,18 @@ static void test_bus_new(void) {
printf("after new: refcount %u\n", REFCNT_GET(bus->n_ref));
}
-static void test_bus_open(void) {
+static int test_bus_open(void) {
_cleanup_bus_unref_ sd_bus *bus = NULL;
+ int r;
- assert_se(sd_bus_open_system(&bus) >= 0);
+ r = sd_bus_open_system(&bus);
+ if (r == -ECONNREFUSED || r == -ENOENT)
+ return r;
+
+ assert_se(r >= 0);
printf("after open: refcount %u\n", REFCNT_GET(bus->n_ref));
+
+ return 0;
}
static void test_bus_new_method_call(void) {
@@ -70,11 +77,20 @@ static void test_bus_new_signal(void) {
}
int main(int argc, char **argv) {
+ int r;
+
log_parse_environment();
log_open();
test_bus_new();
- test_bus_open();
+ r = test_bus_open();
+ if (r < 0) {
+ log_info("Failed to connect to bus, skipping tests.");
+ return EXIT_TEST_SKIP;
+ }
+
test_bus_new_method_call();
test_bus_new_signal();
+
+ return EXIT_SUCCESS;
}
diff --git a/src/test/test-engine.c b/src/test/test-engine.c
index 1b71416a04..6acd394c67 100644
--- a/src/test/test-engine.c
+++ b/src/test/test-engine.c
@@ -39,7 +39,7 @@ int main(int argc, char *argv[]) {
/* prepare the test */
assert_se(set_unit_path(TEST_DIR) >= 0);
r = manager_new(SYSTEMD_USER, true, &m);
- if (r == -EPERM || r == -EACCES || r == -EADDRINUSE || r == -EHOSTDOWN) {
+ if (IN_SET(r, -EPERM, -EACCES, -EADDRINUSE, -EHOSTDOWN, -ENOENT)) {
printf("Skipping test: manager_new: %s", strerror(-r));
return EXIT_TEST_SKIP;
}
diff --git a/src/test/test-sched-prio.c b/src/test/test-sched-prio.c
index 2f559b0413..6b3128d3b7 100644
--- a/src/test/test-sched-prio.c
+++ b/src/test/test-sched-prio.c
@@ -35,7 +35,7 @@ int main(int argc, char *argv[]) {
/* prepare the test */
assert_se(set_unit_path(TEST_DIR) >= 0);
r = manager_new(SYSTEMD_USER, true, &m);
- if (r == -EPERM || r == -EACCES || r == -EADDRINUSE || r == -EHOSTDOWN) {
+ if (IN_SET(r, -EPERM, -EACCES, -EADDRINUSE, -EHOSTDOWN, -ENOENT)) {
printf("Skipping test: manager_new: %s", strerror(-r));
return EXIT_TEST_SKIP;
}

View File

@ -0,0 +1,87 @@
From 654c2d478f50ffbb367dbdc3745f795fcc34574b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Date: Sun, 12 Oct 2014 17:27:53 -0500
Subject: [PATCH] man: join tables in systemd-detect-virt(1)
I think it is more readable and nicer if everything is in
one table.
Also, describe what the return value, since it seems awkward to
describe the change in behaviour with --quiet before describing
what the default is.
---
man/systemd-detect-virt.xml | 37 +++++++++++++++++--------------------
1 file changed, 17 insertions(+), 20 deletions(-)
diff --git a/man/systemd-detect-virt.xml b/man/systemd-detect-virt.xml
index eed0fe0ce9..d8e881cf2e 100644
--- a/man/systemd-detect-virt.xml
+++ b/man/systemd-detect-virt.xml
@@ -61,7 +61,14 @@
execution in a virtualized environment. It identifies
the virtualization technology and can distinguish full
VM virtualization from container
- virtualization.</para>
+ virtualization. <filename>systemd-detect-virt</filename>
+ exits with a return value of 0 (success) if a
+ virtualization technology is detected, and non-zero
+ (error) otherwise. By default any type of
+ virtualization is detected, and the options
+ <option>--container</option> and <option>--vm</option>
+ can be used to limit what types of virtualization are
+ detected.</para>
<para>When executed without <option>--quiet</option>
will print a short identifier for the detected
@@ -69,18 +76,23 @@
are currently identified:</para>
<table>
- <title>Known VM virtualization technologies (i.e. full hardware virtualization)</title>
- <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <title>Known virtualization technologies (both
+ VM, i.e. full hardware virtualization,
+ and container, i.e. shared kernel virtualization)</title>
+ <tgroup cols='3' align='left' colsep='1' rowsep='1'>
+ <colspec colname="type" />
<colspec colname="id" />
<colspec colname="product" />
<thead>
<row>
+ <entry>Type</entry>
<entry>ID</entry>
- <entry>VM Product</entry>
+ <entry>Product</entry>
</row>
</thead>
<tbody>
<row>
+ <entry morerows="8">VM</entry>
<entry><varname>qemu</varname></entry>
<entry>QEMU software virtualization</entry>
</row>
@@ -125,23 +137,8 @@
<entry>User-mode Linux</entry>
</row>
- </tbody>
- </tgroup>
- </table>
-
- <table>
- <title>Known container virtualization technologies (i.e. shared kernel virtualization)</title>
- <tgroup cols='2' align='left' colsep='1' rowsep='1'>
- <colspec colname="id" />
- <colspec colname="product" />
- <thead>
- <row>
- <entry>ID</entry>
- <entry>Container Product</entry>
- </row>
- </thead>
- <tbody>
<row>
+ <entry morerows="5">container</entry>
<entry><varname>openvz</varname></entry>
<entry>OpenVZ/Virtuozzo</entry>
</row>

View File

@ -0,0 +1,23 @@
From e7aab5412829ed6b50d109f670bd0b1b365838a7 Mon Sep 17 00:00:00 2001
From: Dave Reisner <dreisner@archlinux.org>
Date: Sat, 11 Oct 2014 20:35:06 -0400
Subject: [PATCH] tmpfiles: compare return against correct errno
name_to_handle_at returns -EOPNOTSUPP, not -ENOTSUP.
---
src/tmpfiles/tmpfiles.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index dafb9aee2f..8108b43042 100644
--- a/src/tmpfiles/tmpfiles.c
+++ b/src/tmpfiles/tmpfiles.c
@@ -259,7 +259,7 @@ static int dir_is_mount_point(DIR *d, const char *subdir) {
/* got only one handle; assume different mount points if one
* of both queries was not supported by the filesystem */
- if (r_p == -ENOSYS || r_p == -ENOTSUP || r == -ENOSYS || r == -ENOTSUP)
+ if (r_p == -ENOSYS || r_p == -EOPNOTSUPP || r == -ENOSYS || r == -EOPNOTSUPP)
return true;
/* return error */

View File

@ -0,0 +1,29 @@
From fc292b5f5854f83379301affe97d909c7c18d702 Mon Sep 17 00:00:00 2001
From: Tom Gundersen <teg@jklm.no>
Date: Mon, 13 Oct 2014 10:07:05 +0200
Subject: [PATCH] test-dhcp-client: add more asserts
---
src/libsystemd-network/test-dhcp-client.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/libsystemd-network/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c
index 7dab97de2f..0515440e4e 100644
--- a/src/libsystemd-network/test-dhcp-client.c
+++ b/src/libsystemd-network/test-dhcp-client.c
@@ -485,12 +485,12 @@ static void test_addr_acq(sd_event *e) {
res = sd_dhcp_client_start(client);
assert_se(res == 0 || res == -EINPROGRESS);
- sd_event_loop(e);
+ assert_se(sd_event_loop(e) >= 0);
test_hangcheck = sd_event_source_unref(test_hangcheck);
- sd_dhcp_client_set_callback(client, NULL, NULL);
- sd_dhcp_client_stop(client);
+ assert_se(sd_dhcp_client_set_callback(client, NULL, NULL) >= 0);
+ assert_se(sd_dhcp_client_stop(client) >= 0);
sd_dhcp_client_unref(client);
test_fd[1] = safe_close(test_fd[1]);

View File

@ -0,0 +1,22 @@
From 70ae006b4380ed6a72211ff8aa70aac2ff381a42 Mon Sep 17 00:00:00 2001
From: Marko Myllynen <myllynen@redhat.com>
Date: Mon, 13 Oct 2014 10:45:00 +0300
Subject: [PATCH] fi-latin1 console keymap is no more
http://git.altlinux.org/people/legion/packages/kbd.git?p=kbd.git;a=commitdiff;h=a88711232f3216debbb02d0171187442863ccedb
---
src/locale/kbd-model-map | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/locale/kbd-model-map b/src/locale/kbd-model-map
index 322c0a9bc2..f39d991179 100644
--- a/src/locale/kbd-model-map
+++ b/src/locale/kbd-model-map
@@ -16,7 +16,6 @@ slovene si pc105 - terminate:ctrl_alt_bksp
hu101 hu pc105 qwerty terminate:ctrl_alt_bksp
jp106 jp jp106 - terminate:ctrl_alt_bksp
croat hr pc105 - terminate:ctrl_alt_bksp
-fi-latin1 fi pc105 - terminate:ctrl_alt_bksp
it2 it pc105 - terminate:ctrl_alt_bksp
hu hu pc105 - terminate:ctrl_alt_bksp
sr-latin rs pc105 latin terminate:ctrl_alt_bksp

View File

@ -616,6 +616,19 @@ Patch0574: 0574-man-reference-table-in-systemd-detect-virt-1-from-Co.patch
Patch0575: 0575-kdbus-fix-buffer-overflow-in-bus_get_owner_kdbus-fun.patch
Patch0576: 0576-fstab-generator-Honor-mount.usr-on-kernel-command-li.patch
Patch0577: 0577-mount-setup-skip-relabelling-when-SELinux-and-SMACK-.patch
Patch0578: 0578-bus-proxyd-fix-compatibility-with-old-dbus-1.patch
Patch0579: 0579-Report-aa_change_onexec-error-code.patch
Patch0580: 0580-sd-dhcp-client-support-non-Ethernet-hardware-address.patch
Patch0581: 0581-terminal-grdrm-force-deep-modeset-on-enter.patch
Patch0582: 0582-NEWS-don-t-mention-noinst_-debug-programs.patch
Patch0583: 0583-Modernization.patch
Patch0584: 0584-Set-NOTIFY_SOCKET-for-control-procs-if-NotifyAccess-.patch
Patch0585: 0585-tests-fix-some-tests-to-pass-in-koji.patch
Patch0586: 0586-man-join-tables-in-systemd-detect-virt-1.patch
Patch0587: 0587-tmpfiles-compare-return-against-correct-errno.patch
Patch0588: 0588-test-dhcp-client-add-more-asserts.patch
Patch0589: 0589-fi-latin1-console-keymap-is-no-more.patch
Patch0998: fedora-disable-resolv.conf-symlink.patch
Patch0999: fedora-add-bridge-sysctl-configuration.patch