Blame src/core/systemd/src/systemd/sd-id128.h

Packit Service 5ffa24
/* SPDX-License-Identifier: LGPL-2.1-or-later */
Packit Service 5ffa24
#ifndef foosdid128hfoo
Packit Service 5ffa24
#define foosdid128hfoo
Packit Service 5ffa24
Packit Service 5ffa24
/***
Packit Service 5ffa24
  systemd is free software; you can redistribute it and/or modify it
Packit Service 5ffa24
  under the terms of the GNU Lesser General Public License as published by
Packit Service 5ffa24
  the Free Software Foundation; either version 2.1 of the License, or
Packit Service 5ffa24
  (at your option) any later version.
Packit Service 5ffa24
Packit Service 5ffa24
  systemd is distributed in the hope that it will be useful, but
Packit Service 5ffa24
  WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 5ffa24
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit Service 5ffa24
  Lesser General Public License for more details.
Packit Service 5ffa24
Packit Service 5ffa24
  You should have received a copy of the GNU Lesser General Public License
Packit Service 5ffa24
  along with systemd; If not, see <http://www.gnu.org/licenses/>.
Packit Service 5ffa24
***/
Packit Service 5ffa24
Packit Service 5ffa24
#include <inttypes.h>
Packit Service 5ffa24
#include <string.h>
Packit Service 5ffa24
Packit Service 5ffa24
#include "_sd-common.h"
Packit Service 5ffa24
Packit Service 5ffa24
_SD_BEGIN_DECLARATIONS;
Packit Service 5ffa24
Packit Service 5ffa24
/* 128-bit ID APIs. See sd-id128(3) for more information. */
Packit Service 5ffa24
Packit Service 5ffa24
typedef union sd_id128 sd_id128_t;
Packit Service 5ffa24
Packit Service 5ffa24
union sd_id128 {
Packit Service 5ffa24
        uint8_t bytes[16];
Packit Service 5ffa24
        uint64_t qwords[2];
Packit Service 5ffa24
};
Packit Service 5ffa24
Packit Service 5ffa24
#define SD_ID128_STRING_MAX 33
Packit Service 5ffa24
Packit Service 5ffa24
char *sd_id128_to_string(sd_id128_t id, char s[_SD_ARRAY_STATIC SD_ID128_STRING_MAX]);
Packit Service 5ffa24
int sd_id128_from_string(const char *s, sd_id128_t *ret);
Packit Service 5ffa24
Packit Service 5ffa24
int sd_id128_randomize(sd_id128_t *ret);
Packit Service 5ffa24
Packit Service 5ffa24
int sd_id128_get_machine(sd_id128_t *ret);
Packit Service 5ffa24
int sd_id128_get_boot(sd_id128_t *ret);
Packit Service 5ffa24
int sd_id128_get_invocation(sd_id128_t *ret);
Packit Service 5ffa24
Packit Service 5ffa24
int sd_id128_get_machine_app_specific(sd_id128_t app_id, sd_id128_t *ret);
Packit Service 5ffa24
int sd_id128_get_boot_app_specific(sd_id128_t app_id, sd_id128_t *ret);
Packit Service 5ffa24
Packit Service 5ffa24
#define SD_ID128_ARRAY(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) \
Packit Service 5ffa24
        { .bytes = { 0x##v0, 0x##v1, 0x##v2, 0x##v3, 0x##v4, 0x##v5, 0x##v6, 0x##v7, \
Packit Service 5ffa24
                     0x##v8, 0x##v9, 0x##v10, 0x##v11, 0x##v12, 0x##v13, 0x##v14, 0x##v15 }}
Packit Service 5ffa24
Packit Service 5ffa24
#define SD_ID128_MAKE(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) \
Packit Service 5ffa24
        ((const sd_id128_t) SD_ID128_ARRAY(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15))
Packit Service 5ffa24
Packit Service 5ffa24
/* Note that SD_ID128_FORMAT_VAL will evaluate the passed argument 16
Packit Service 5ffa24
 * times. It is hence not a good idea to call this macro with an
Packit Service 5ffa24
 * expensive function as parameter or an expression with side
Packit Service 5ffa24
 * effects */
Packit Service 5ffa24
Packit Service 5ffa24
#define SD_ID128_FORMAT_STR "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
Packit Service 5ffa24
#define SD_ID128_FORMAT_VAL(x) (x).bytes[0], (x).bytes[1], (x).bytes[2], (x).bytes[3], (x).bytes[4], (x).bytes[5], (x).bytes[6], (x).bytes[7], (x).bytes[8], (x).bytes[9], (x).bytes[10], (x).bytes[11], (x).bytes[12], (x).bytes[13], (x).bytes[14], (x).bytes[15]
Packit Service 5ffa24
Packit Service 5ffa24
/* Like SD_ID128_FORMAT_STR, but formats as UUID, not in plain format */
Packit Service 5ffa24
#define SD_ID128_UUID_FORMAT_STR "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
Packit Service 5ffa24
Packit Service 5ffa24
#define SD_ID128_CONST_STR(x)                                           \
Packit Service 5ffa24
        ((const char[SD_ID128_STRING_MAX]) {                            \
Packit Service 5ffa24
                ((x).bytes[0] >> 4) >= 10 ? 'a' + ((x).bytes[0] >> 4) - 10 : '0' + ((x).bytes[0] >> 4), \
Packit Service 5ffa24
                ((x).bytes[0] & 15) >= 10 ? 'a' + ((x).bytes[0] & 15) - 10 : '0' + ((x).bytes[0] & 15), \
Packit Service 5ffa24
                ((x).bytes[1] >> 4) >= 10 ? 'a' + ((x).bytes[1] >> 4) - 10 : '0' + ((x).bytes[1] >> 4), \
Packit Service 5ffa24
                ((x).bytes[1] & 15) >= 10 ? 'a' + ((x).bytes[1] & 15) - 10 : '0' + ((x).bytes[1] & 15), \
Packit Service 5ffa24
                ((x).bytes[2] >> 4) >= 10 ? 'a' + ((x).bytes[2] >> 4) - 10 : '0' + ((x).bytes[2] >> 4), \
Packit Service 5ffa24
                ((x).bytes[2] & 15) >= 10 ? 'a' + ((x).bytes[2] & 15) - 10 : '0' + ((x).bytes[2] & 15), \
Packit Service 5ffa24
                ((x).bytes[3] >> 4) >= 10 ? 'a' + ((x).bytes[3] >> 4) - 10 : '0' + ((x).bytes[3] >> 4), \
Packit Service 5ffa24
                ((x).bytes[3] & 15) >= 10 ? 'a' + ((x).bytes[3] & 15) - 10 : '0' + ((x).bytes[3] & 15), \
Packit Service 5ffa24
                ((x).bytes[4] >> 4) >= 10 ? 'a' + ((x).bytes[4] >> 4) - 10 : '0' + ((x).bytes[4] >> 4), \
Packit Service 5ffa24
                ((x).bytes[4] & 15) >= 10 ? 'a' + ((x).bytes[4] & 15) - 10 : '0' + ((x).bytes[4] & 15), \
Packit Service 5ffa24
                ((x).bytes[5] >> 4) >= 10 ? 'a' + ((x).bytes[5] >> 4) - 10 : '0' + ((x).bytes[5] >> 4), \
Packit Service 5ffa24
                ((x).bytes[5] & 15) >= 10 ? 'a' + ((x).bytes[5] & 15) - 10 : '0' + ((x).bytes[5] & 15), \
Packit Service 5ffa24
                ((x).bytes[6] >> 4) >= 10 ? 'a' + ((x).bytes[6] >> 4) - 10 : '0' + ((x).bytes[6] >> 4), \
Packit Service 5ffa24
                ((x).bytes[6] & 15) >= 10 ? 'a' + ((x).bytes[6] & 15) - 10 : '0' + ((x).bytes[6] & 15), \
Packit Service 5ffa24
                ((x).bytes[7] >> 4) >= 10 ? 'a' + ((x).bytes[7] >> 4) - 10 : '0' + ((x).bytes[7] >> 4), \
Packit Service 5ffa24
                ((x).bytes[7] & 15) >= 10 ? 'a' + ((x).bytes[7] & 15) - 10 : '0' + ((x).bytes[7] & 15), \
Packit Service 5ffa24
                ((x).bytes[8] >> 4) >= 10 ? 'a' + ((x).bytes[8] >> 4) - 10 : '0' + ((x).bytes[8] >> 4), \
Packit Service 5ffa24
                ((x).bytes[8] & 15) >= 10 ? 'a' + ((x).bytes[8] & 15) - 10 : '0' + ((x).bytes[8] & 15), \
Packit Service 5ffa24
                ((x).bytes[9] >> 4) >= 10 ? 'a' + ((x).bytes[9] >> 4) - 10 : '0' + ((x).bytes[9] >> 4), \
Packit Service 5ffa24
                ((x).bytes[9] & 15) >= 10 ? 'a' + ((x).bytes[9] & 15) - 10 : '0' + ((x).bytes[9] & 15), \
Packit Service 5ffa24
                ((x).bytes[10] >> 4) >= 10 ? 'a' + ((x).bytes[10] >> 4) - 10 : '0' + ((x).bytes[10] >> 4), \
Packit Service 5ffa24
                ((x).bytes[10] & 15) >= 10 ? 'a' + ((x).bytes[10] & 15) - 10 : '0' + ((x).bytes[10] & 15), \
Packit Service 5ffa24
                ((x).bytes[11] >> 4) >= 10 ? 'a' + ((x).bytes[11] >> 4) - 10 : '0' + ((x).bytes[11] >> 4), \
Packit Service 5ffa24
                ((x).bytes[11] & 15) >= 10 ? 'a' + ((x).bytes[11] & 15) - 10 : '0' + ((x).bytes[11] & 15), \
Packit Service 5ffa24
                ((x).bytes[12] >> 4) >= 10 ? 'a' + ((x).bytes[12] >> 4) - 10 : '0' + ((x).bytes[12] >> 4), \
Packit Service 5ffa24
                ((x).bytes[12] & 15) >= 10 ? 'a' + ((x).bytes[12] & 15) - 10 : '0' + ((x).bytes[12] & 15), \
Packit Service 5ffa24
                ((x).bytes[13] >> 4) >= 10 ? 'a' + ((x).bytes[13] >> 4) - 10 : '0' + ((x).bytes[13] >> 4), \
Packit Service 5ffa24
                ((x).bytes[13] & 15) >= 10 ? 'a' + ((x).bytes[13] & 15) - 10 : '0' + ((x).bytes[13] & 15), \
Packit Service 5ffa24
                ((x).bytes[14] >> 4) >= 10 ? 'a' + ((x).bytes[14] >> 4) - 10 : '0' + ((x).bytes[14] >> 4), \
Packit Service 5ffa24
                ((x).bytes[14] & 15) >= 10 ? 'a' + ((x).bytes[14] & 15) - 10 : '0' + ((x).bytes[14] & 15), \
Packit Service 5ffa24
                ((x).bytes[15] >> 4) >= 10 ? 'a' + ((x).bytes[15] >> 4) - 10 : '0' + ((x).bytes[15] >> 4), \
Packit Service 5ffa24
                ((x).bytes[15] & 15) >= 10 ? 'a' + ((x).bytes[15] & 15) - 10 : '0' + ((x).bytes[15] & 15), \
Packit Service 5ffa24
                0 })
Packit Service 5ffa24
Packit Service 5ffa24
#define SD_ID128_MAKE_STR(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) \
Packit Service 5ffa24
        #a #b #c #d #e #f #g #h #i #j #k #l #m #n #o #p
Packit Service 5ffa24
Packit Service 5ffa24
_sd_pure_ static __inline__ int sd_id128_equal(sd_id128_t a, sd_id128_t b) {
Packit Service 5ffa24
        return memcmp(&a, &b, 16) == 0;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
_sd_pure_ static __inline__ int sd_id128_is_null(sd_id128_t a) {
Packit Service 5ffa24
        return a.qwords[0] == 0 && a.qwords[1] == 0;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
_sd_pure_ static __inline__ int sd_id128_is_allf(sd_id128_t a) {
Packit Service 5ffa24
        return a.qwords[0] == UINT64_C(0xFFFFFFFFFFFFFFFF) && a.qwords[1] == UINT64_C(0xFFFFFFFFFFFFFFFF);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
#define SD_ID128_NULL ((const sd_id128_t) { .qwords = { 0, 0 }})
Packit Service 5ffa24
#define SD_ID128_ALLF ((const sd_id128_t) { .qwords = { UINT64_C(0xFFFFFFFFFFFFFFFF), UINT64_C(0xFFFFFFFFFFFFFFFF) }})
Packit Service 5ffa24
Packit Service 5ffa24
_SD_END_DECLARATIONS;
Packit Service 5ffa24
Packit Service 5ffa24
#endif