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

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