1 /* SPDX-License-Identifier: LGPL-2.1-or-later */ 2 #ifndef foosdcommonhfoo 3 #define foosdcommonhfoo 4 5 /*** 6 systemd is free software; you can redistribute it and/or modify it 7 under the terms of the GNU Lesser General Public License as published by 8 the Free Software Foundation; either version 2.1 of the License, or 9 (at your option) any later version. 10 11 systemd is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public License 17 along with systemd; If not, see <http://www.gnu.org/licenses/>. 18 ***/ 19 20 /* This is a private header; never even think of including this directly! */ 21 22 #if defined(__INCLUDE_LEVEL__) && __INCLUDE_LEVEL__ <= 1 && !defined(__COVERITY__) 23 # error "Do not include _sd-common.h directly; it is a private header." 24 #endif 25 26 typedef void (*_sd_destroy_t)(void *userdata); 27 28 #ifndef _sd_printf_ 29 # if __GNUC__ >= 4 30 # define _sd_printf_(a,b) __attribute__((__format__(printf, a, b))) 31 # else 32 # define _sd_printf_(a,b) 33 # endif 34 #endif 35 36 #ifndef _sd_sentinel_ 37 # define _sd_sentinel_ __attribute__((__sentinel__)) 38 #endif 39 40 #ifndef _sd_packed_ 41 # define _sd_packed_ __attribute__((__packed__)) 42 #endif 43 44 #ifndef _sd_pure_ 45 # define _sd_pure_ __attribute__((__pure__)) 46 #endif 47 48 /* Note that strictly speaking __deprecated__ has been available before GCC 6. However, starting with GCC 6 49 * it also works on enum values, which we are interested in. Since this is a developer-facing feature anyway 50 * (as opposed to build engineer-facing), let's hence conditionalize this to gcc 6, given that the developers 51 * are probably going to use something newer anyway. */ 52 #ifndef _sd_deprecated_ 53 # if __GNUC__ >= 6 54 # define _sd_deprecated_ __attribute__((__deprecated__)) 55 # else 56 # define _sd_deprecated_ 57 # endif 58 #endif 59 60 #ifndef _SD_STRINGIFY 61 # define _SD_XSTRINGIFY(x) #x 62 # define _SD_STRINGIFY(x) _SD_XSTRINGIFY(x) 63 #endif 64 65 #ifndef _SD_BEGIN_DECLARATIONS 66 # ifdef __cplusplus 67 # define _SD_BEGIN_DECLARATIONS \ 68 extern "C" { \ 69 struct _sd_useless_struct_to_allow_trailing_semicolon_ 70 # else 71 # define _SD_BEGIN_DECLARATIONS \ 72 struct _sd_useless_struct_to_allow_trailing_semicolon_ 73 # endif 74 #endif 75 76 #ifndef _SD_END_DECLARATIONS 77 # ifdef __cplusplus 78 # define _SD_END_DECLARATIONS \ 79 } \ 80 struct _sd_useless_cpp_struct_to_allow_trailing_semicolon_ 81 # else 82 # define _SD_END_DECLARATIONS \ 83 struct _sd_useless_struct_to_allow_trailing_semicolon_ 84 # endif 85 #endif 86 87 #ifndef _SD_ARRAY_STATIC 88 # if __STDC_VERSION__ >= 199901L 89 # define _SD_ARRAY_STATIC static 90 # else 91 # define _SD_ARRAY_STATIC 92 # endif 93 #endif 94 95 #define _SD_DEFINE_POINTER_CLEANUP_FUNC(type, func) \ 96 static __inline__ void func##p(type **p) { \ 97 if (*p) \ 98 func(*p); \ 99 } \ 100 struct _sd_useless_struct_to_allow_trailing_semicolon_ 101 102 /* The following macro should be used in all public enums, to force 64bit wideness on them, so that we can 103 * freely extend them later on, without breaking compatibility. */ 104 #define _SD_ENUM_FORCE_S64(id) \ 105 _SD_##id##_INT64_MIN = INT64_MIN, \ 106 _SD_##id##_INT64_MAX = INT64_MAX 107 108 #endif 109