sd_rtnl *rtnl;
char **link_dirs;
- usec_t *link_dirs_ts_usec;
+ usec_t link_dirs_ts_usec;
};
+DEFINE_TRIVIAL_CLEANUP_FUNC(link_config_ctx*, link_config_ctx_free);
+#define _cleanup_link_config_ctx_free_ _cleanup_(link_config_ctx_freep)
+
int link_config_ctx_new(link_config_ctx **ret) {
- link_config_ctx *ctx;
+ _cleanup_link_config_ctx_free_ link_config_ctx *ctx = NULL;
int r;
if (!ret)
return -ENOMEM;
r = ethtool_connect(&ctx->ethtool_fd);
- if (r < 0) {
- link_config_ctx_free(ctx);
+ if (r < 0)
return r;
- }
r = sd_rtnl_open(0, &ctx->rtnl);
- if (r < 0) {
- link_config_ctx_free(ctx);
+ if (r < 0)
return r;
- }
LIST_HEAD_INIT(ctx->links);
NULL);
if (!ctx->link_dirs) {
log_error("failed to build link config directory array");
- link_config_ctx_free(ctx);
return -ENOMEM;
}
+
if (!path_strv_canonicalize_uniq(ctx->link_dirs)) {
log_error("failed to canonicalize link config directories\n");
- link_config_ctx_free(ctx);
- return -ENOMEM;
- }
-
- ctx->link_dirs_ts_usec = calloc(strv_length(ctx->link_dirs), sizeof(usec_t));
- if(!ctx->link_dirs_ts_usec) {
- link_config_ctx_free(ctx);
return -ENOMEM;
}
*ret = ctx;
+ ctx = NULL;
+
return 0;
}
sd_rtnl_unref(ctx->rtnl);
strv_free(ctx->link_dirs);
- free(ctx->link_dirs_ts_usec);
link_configs_free(ctx);
free(ctx);
link_configs_free(ctx);
- /* update timestamps */
- paths_check_timestamp(ctx->link_dirs, ctx->link_dirs_ts_usec, true);
+ /* update timestamp */
+ paths_check_timestamp(ctx->link_dirs, &ctx->link_dirs_ts_usec, true);
r = conf_files_list_strv(&files, ".link", NULL, (const char **)ctx->link_dirs);
if (r < 0) {
}
bool link_config_should_reload(link_config_ctx *ctx) {
- return paths_check_timestamp(ctx->link_dirs, ctx->link_dirs_ts_usec, false);
+ return paths_check_timestamp(ctx->link_dirs, &ctx->link_dirs_ts_usec, false);
}
static bool match_config(link_config *match, struct udev_device *device) {
}
if (need_update) {
- r = sd_rtnl_send_with_reply_and_block(rtnl, message, 5 * USEC_PER_SEC, NULL);
+ r = sd_rtnl_send_with_reply_and_block(rtnl, message, 0, NULL);
if (r < 0)
return r;
}
static bool mac_is_random(struct udev_device *device) {
const char *s;
- int type;
+ unsigned type;
+ int r;
s = udev_device_get_sysattr_value(device, "addr_assign_type");
if (!s)
- return -EINVAL;
- type = strtoul(s, NULL, 0);
+ return false; /* if we don't know, assume it is not random */
+ r = safe_atou(s, &type);
+ if (r < 0)
+ return false;
/* check for NET_ADDR_RANDOM */
return type == 1;
static bool mac_is_permanent(struct udev_device *device) {
const char *s;
- int type;
+ unsigned type;
+ int r;
s = udev_device_get_sysattr_value(device, "addr_assign_type");
if (!s)
- return -EINVAL;
- type = strtoul(s, NULL, 0);
+ return true; /* if we don't know, assume it is permanent */
+ r = safe_atou(s, &type);
+ if (r < 0)
+ return true;
/* check for NET_ADDR_PERM */
return type == 0;
if (!name) {
name = udev_device_get_property_value(device, "ID_NET_NAME_PATH");
if (!name)
- return -1;
+ return -ENOENT;
}
}
/* fetch some persistent data unique to this machine */
r = sd_id128_get_machine(&machine);
if (r < 0)
- return -1;
+ return r;
/* combine the data */
seed_str = strappenda(name, sd_id128_to_string(machine, machineid_buf));