]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ether-addr-util: introduce hw_addr_to_string_full()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 11 Nov 2021 02:55:04 +0000 (11:55 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 11 Nov 2021 09:29:52 +0000 (18:29 +0900)
src/basic/ether-addr-util.c
src/basic/ether-addr-util.h

index 9be4baf1233153d781cd946d10172157bfc43e58..699dcff93fc1d5efe2b400fa0850cc9fcb7c08d4 100644 (file)
 #include "macro.h"
 #include "string-util.h"
 
-char* hw_addr_to_string(const struct hw_addr_data *addr, char buffer[HW_ADDR_TO_STRING_MAX]) {
+char *hw_addr_to_string_full(
+                const struct hw_addr_data *addr,
+                HardwareAddressToStringFlags flags,
+                char buffer[static HW_ADDR_TO_STRING_MAX]) {
+
         assert(addr);
         assert(buffer);
         assert(addr->length <= HW_ADDR_MAX_SIZE);
@@ -19,10 +23,13 @@ char* hw_addr_to_string(const struct hw_addr_data *addr, char buffer[HW_ADDR_TO_
         for (size_t i = 0, j = 0; i < addr->length; i++) {
                 buffer[j++] = hexchar(addr->bytes[i] >> 4);
                 buffer[j++] = hexchar(addr->bytes[i] & 0x0f);
-                buffer[j++] = ':';
+                if (!FLAGS_SET(flags, HW_ADDR_TO_STRING_NO_COLON))
+                        buffer[j++] = ':';
         }
 
-        buffer[addr->length > 0 ? addr->length * 3 - 1 : 0] = '\0';
+        buffer[addr->length == 0 || FLAGS_SET(flags, HW_ADDR_TO_STRING_NO_COLON) ?
+               addr->length * 2 :
+               addr->length * 3 - 1] = '\0';
         return buffer;
 }
 
index ae6605fb1145005dcd48fb710e0e0da447e8cad6..b362824a8f18664bc44e744ecbd77ddb8a199900 100644 (file)
@@ -31,13 +31,24 @@ static inline int parse_hw_addr(const char *s, struct hw_addr_data *ret) {
 }
 int parse_ether_addr(const char *s, struct ether_addr *ret);
 
+typedef enum HardwareAddressToStringFlags {
+        HW_ADDR_TO_STRING_NO_COLON = 1 << 0,
+} HardwareAddressToStringFlags;
+
 #define HW_ADDR_TO_STRING_MAX (3*HW_ADDR_MAX_SIZE)
-char* hw_addr_to_string(const struct hw_addr_data *addr, char buffer[HW_ADDR_TO_STRING_MAX]);
+char *hw_addr_to_string_full(
+                const struct hw_addr_data *addr,
+                HardwareAddressToStringFlags flags,
+                char buffer[static HW_ADDR_TO_STRING_MAX]);
+static inline char *hw_addr_to_string(const struct hw_addr_data *addr, char buffer[static HW_ADDR_TO_STRING_MAX]) {
+        return hw_addr_to_string_full(addr, 0, buffer);
+}
 
 /* Note: the lifetime of the compound literal is the immediately surrounding block,
  * see C11 ยง6.5.2.5, and
  * https://stackoverflow.com/questions/34880638/compound-literal-lifetime-and-if-blocks */
-#define HW_ADDR_TO_STR(hw_addr) hw_addr_to_string((hw_addr), (char[HW_ADDR_TO_STRING_MAX]){})
+#define HW_ADDR_TO_STR_FULL(hw_addr, flags) hw_addr_to_string_full((hw_addr), flags, (char[HW_ADDR_TO_STRING_MAX]){})
+#define HW_ADDR_TO_STR(hw_addr) HW_ADDR_TO_STR_FULL(hw_addr, 0)
 
 #define HW_ADDR_NULL ((const struct hw_addr_data){})