summaryrefslogtreecommitdiff
path: root/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
blob: 83b2d74e199dfe587a786dcb9fc3220be1caa955 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (C) 2008 - 2017 Red Hat, Inc.
 */

#ifndef _UTILS_H_
#define _UTILS_H_

#include "nm-connection.h"
#include "nm-libnm-core-intern/nm-ethtool-utils.h"

#include "shvar.h"

/*****************************************************************************/

typedef enum {
	NMS_IFCFG_KEY_TYPE_UNKNOWN         = 0,
	NMS_IFCFG_KEY_TYPE_WELL_KNOWN      = (1u << 0),

	NMS_IFCFG_KEY_TYPE_IS_PLAIN        = (1u << 1),
	NMS_IFCFG_KEY_TYPE_IS_NUMBERED     = (1u << 2),
	NMS_IFCFG_KEY_TYPE_IS_PREFIX       = (1u << 3),

	/* by default, well knowns keys that are not explicitly set
	 * by the writer (the unvisited, dirty ones) are removed.
	 * With this flag, such keys are kept if they are present. */
	NMS_IFCFG_KEY_TYPE_KEEP_WHEN_DIRTY = (1u << 4),

} NMSIfcfgKeyTypeFlags;

typedef struct {
	const char *key_name;
	NMSIfcfgKeyTypeFlags key_flags;
} NMSIfcfgKeyTypeInfo;

extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[237];

const NMSIfcfgKeyTypeInfo *nms_ifcfg_well_known_key_find_info (const char *key, gssize *out_idx);

static inline NMSIfcfgKeyTypeFlags
nms_ifcfg_well_known_key_find_info_flags (const char *key)
{
	const NMSIfcfgKeyTypeInfo *ti;

	ti = nms_ifcfg_well_known_key_find_info (key, NULL);
	if (!ti)
		return NMS_IFCFG_KEY_TYPE_UNKNOWN;
	return ti->key_flags;
}

/*****************************************************************************/

gboolean nms_ifcfg_rh_utils_parse_unhandled_spec (const char *unhandled_spec,
                                                  const char **out_unmanaged_spec,
                                                  const char **out_unrecognized_spec);

#define NM_IFCFG_CONNECTION_LOG_PATH(path)  ((path) ?: "in-memory")
#define NM_IFCFG_CONNECTION_LOG_FMT         "%s (%s,\"%s\")"
#define NM_IFCFG_CONNECTION_LOG_ARG(con)    NM_IFCFG_CONNECTION_LOG_PATH (nm_settings_connection_get_filename ((NMSettingsConnection *) (con))), nm_settings_connection_get_uuid ((NMSettingsConnection *) (con)), nm_settings_connection_get_id ((NMSettingsConnection *) (con))
#define NM_IFCFG_CONNECTION_LOG_FMTD        "%s (%s,\"%s\",%p)"
#define NM_IFCFG_CONNECTION_LOG_ARGD(con)   NM_IFCFG_CONNECTION_LOG_PATH (nm_settings_connection_get_filename ((NMSettingsConnection *) (con))), nm_settings_connection_get_uuid ((NMSettingsConnection *) (con)), nm_settings_connection_get_id ((NMSettingsConnection *) (con)), (con)

char *utils_cert_path (const char *parent, const char *suffix, const char *extension);

const char *utils_get_ifcfg_name (const char *file, gboolean only_ifcfg);

gboolean utils_should_ignore_file (const char *filename, gboolean only_ifcfg);

char *utils_get_ifcfg_path (const char *parent);
char *utils_get_keys_path (const char *parent);
char *utils_get_route_path (const char *parent);
char *utils_get_route6_path (const char *parent);

shvarFile *utils_get_extra_ifcfg (const char *parent, const char *tag, gboolean should_create);
shvarFile *utils_get_keys_ifcfg (const char *parent, gboolean should_create);
shvarFile *utils_get_route_ifcfg (const char *parent, gboolean should_create);

gboolean utils_has_route_file_new_syntax (const char *filename);
gboolean utils_has_route_file_new_syntax_content (const char *contents,
                                                  gsize len);
gboolean utils_has_complex_routes (const char *filename, int addr_family);

gboolean utils_is_ifcfg_alias_file (const char *alias, const char *ifcfg);

char *utils_detect_ifcfg_path (const char *path, gboolean only_ifcfg);

void nms_ifcfg_rh_utils_user_key_encode (const char *key, GString *str_buffer);
gboolean nms_ifcfg_rh_utils_user_key_decode (const char *name, GString *str_buffer);

static inline const char *
_nms_ifcfg_rh_utils_numbered_tag (char *buf, gsize buf_len, const char *tag_name, int which)
{
	gsize l;

#if NM_MORE_ASSERTS > 5
	nm_assert (NM_FLAGS_ALL (nms_ifcfg_well_known_key_find_info_flags (tag_name),
	                           NMS_IFCFG_KEY_TYPE_WELL_KNOWN
	                         | NMS_IFCFG_KEY_TYPE_IS_NUMBERED));
#endif

	l = g_strlcpy (buf, tag_name, buf_len);
	nm_assert (l < buf_len);
	if (which != -1) {
		buf_len -= l;
		l = g_snprintf (&buf[l], buf_len, "%d", which);
		nm_assert (l < buf_len);
	}
	return buf;
}
#define numbered_tag(buf, tag_name, which) \
	({ \
		_nm_unused char *const _buf = (buf); \
		\
		/* some static assert trying to ensure that the buffer is statically allocated.
		 * It disallows a buffer size of sizeof(gpointer) to catch that. */ \
		G_STATIC_ASSERT (G_N_ELEMENTS (buf) == sizeof (buf) && sizeof (buf) != sizeof (char *) && sizeof (buf) < G_MAXINT); \
		_nms_ifcfg_rh_utils_numbered_tag (buf, sizeof (buf), ""tag_name"", (which)); \
	})

gboolean nms_ifcfg_rh_utils_is_numbered_tag_impl (const char *key,
                                                  const char *tag,
                                                  gsize tag_len,
                                                  gint64 *out_idx);

static inline gboolean
nms_ifcfg_rh_utils_is_numbered_tag (const char *key,
                                    const char *tag,
                                    gint64 *out_idx)
{
	nm_assert (tag);

	return nms_ifcfg_rh_utils_is_numbered_tag_impl (key, tag, strlen (tag), out_idx);
}

#define NMS_IFCFG_RH_UTIL_IS_NUMBERED_TAG(key, tag, out_idx) \
	nms_ifcfg_rh_utils_is_numbered_tag_impl (key, tag, NM_STRLEN (tag), out_idx)

/*****************************************************************************/

const NMSIfcfgKeyTypeInfo *nms_ifcfg_rh_utils_is_well_known_key (const char *key);

/*****************************************************************************/

extern const char *const _nm_ethtool_ifcfg_names[_NM_ETHTOOL_ID_NUM];

static inline const char *
nms_ifcfg_rh_utils_get_ethtool_name (NMEthtoolID ethtool_id)
{
	nm_assert (ethtool_id >= _NM_ETHTOOL_ID_FIRST && ethtool_id <= _NM_ETHTOOL_ID_LAST);
	nm_assert (ethtool_id < G_N_ELEMENTS (_nm_ethtool_ifcfg_names));
	nm_assert (_nm_ethtool_ifcfg_names[ethtool_id]);

	return _nm_ethtool_ifcfg_names[ethtool_id];
}

const NMEthtoolData *nms_ifcfg_rh_utils_get_ethtool_by_name (const char *name,
                                                             NMEthtoolType ethtool_type);

#endif  /* _UTILS_H_ */