Line data Source code
1 : /* Declarations for common convenience functions.
2 : Copyright (C) 2006-2011 Red Hat, Inc.
3 : This file is part of elfutils.
4 :
5 : This file is free software; you can redistribute it and/or modify
6 : it under the terms of either
7 :
8 : * the GNU Lesser General Public License as published by the Free
9 : Software Foundation; either version 3 of the License, or (at
10 : your option) any later version
11 :
12 : or
13 :
14 : * the GNU General Public License as published by the Free
15 : Software Foundation; either version 2 of the License, or (at
16 : your option) any later version
17 :
18 : or both in parallel, as here.
19 :
20 : elfutils is distributed in the hope that it will be useful, but
21 : WITHOUT ANY WARRANTY; without even the implied warranty of
22 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 : General Public License for more details.
24 :
25 : You should have received copies of the GNU General Public License and
26 : the GNU Lesser General Public License along with this program. If
27 : not, see <http://www.gnu.org/licenses/>. */
28 :
29 : #ifndef LIB_SYSTEM_H
30 : #define LIB_SYSTEM_H 1
31 :
32 : #include <errno.h>
33 : #include <error.h>
34 : #include <stddef.h>
35 : #include <stdint.h>
36 : #include <sys/param.h>
37 : #include <endian.h>
38 : #include <byteswap.h>
39 : #include <unistd.h>
40 :
41 : #if __BYTE_ORDER == __LITTLE_ENDIAN
42 : # define LE32(n) (n)
43 : # define LE64(n) (n)
44 : # define BE32(n) bswap_32 (n)
45 : # define BE64(n) bswap_64 (n)
46 : #elif __BYTE_ORDER == __BIG_ENDIAN
47 : # define BE32(n) (n)
48 : # define BE64(n) (n)
49 : # define LE32(n) bswap_32 (n)
50 : # define LE64(n) bswap_64 (n)
51 : #else
52 : # error "Unknown byte order"
53 : #endif
54 :
55 : #ifndef MAX
56 : #define MAX(m, n) ((m) < (n) ? (n) : (m))
57 : #endif
58 :
59 : #ifndef MIN
60 : #define MIN(m, n) ((m) < (n) ? (m) : (n))
61 : #endif
62 :
63 : #if !HAVE_DECL_POWEROF2
64 : #define powerof2(x) (((x) & ((x) - 1)) == 0)
65 : #endif
66 :
67 : #if !HAVE_DECL_MEMPCPY
68 : #define mempcpy(dest, src, n) \
69 : ((void *) ((char *) memcpy (dest, src, n) + (size_t) n))
70 : #endif
71 :
72 : /* A special gettext function we use if the strings are too short. */
73 : #define sgettext(Str) \
74 : ({ const char *__res = strrchr (gettext (Str), '|'); \
75 : __res ? __res + 1 : Str; })
76 :
77 : #define gettext_noop(Str) Str
78 :
79 : #ifndef TEMP_FAILURE_RETRY
80 : #define TEMP_FAILURE_RETRY(expression) \
81 : ({ ssize_t __res; \
82 : do \
83 : __res = expression; \
84 : while (__res == -1 && errno == EINTR); \
85 : __res; })
86 : #endif
87 :
88 : static inline ssize_t __attribute__ ((unused))
89 1777185 : pwrite_retry (int fd, const void *buf, size_t len, off_t off)
90 : {
91 1777185 : ssize_t recvd = 0;
92 :
93 : do
94 : {
95 1777185 : ssize_t ret = TEMP_FAILURE_RETRY (pwrite (fd, buf + recvd, len - recvd,
96 : off + recvd));
97 1777185 : if (ret <= 0)
98 137 : return ret < 0 ? ret : recvd;
99 :
100 1777048 : recvd += ret;
101 : }
102 1777048 : while ((size_t) recvd < len);
103 :
104 : return recvd;
105 : }
106 :
107 : static inline ssize_t __attribute__ ((unused))
108 54 : write_retry (int fd, const void *buf, size_t len)
109 : {
110 54 : ssize_t recvd = 0;
111 :
112 : do
113 : {
114 54 : ssize_t ret = TEMP_FAILURE_RETRY (write (fd, buf + recvd, len - recvd));
115 54 : if (ret <= 0)
116 0 : return ret < 0 ? ret : recvd;
117 :
118 54 : recvd += ret;
119 : }
120 54 : while ((size_t) recvd < len);
121 :
122 : return recvd;
123 : }
124 :
125 : static inline ssize_t __attribute__ ((unused))
126 1274053 : pread_retry (int fd, void *buf, size_t len, off_t off)
127 : {
128 1274053 : ssize_t recvd = 0;
129 :
130 : do
131 : {
132 2558128 : ssize_t ret = TEMP_FAILURE_RETRY (pread (fd, buf + recvd, len - recvd,
133 : off + recvd));
134 1279064 : if (ret <= 0)
135 5011 : return ret < 0 ? ret : recvd;
136 :
137 1274053 : recvd += ret;
138 : }
139 1274053 : while ((size_t) recvd < len);
140 :
141 : return recvd;
142 : }
143 :
144 : /* The demangler from libstdc++. */
145 : extern char *__cxa_demangle (const char *mangled_name, char *output_buffer,
146 : size_t *length, int *status);
147 :
148 : /* A static assertion. This will cause a compile-time error if EXPR,
149 : which must be a compile-time constant, is false. */
150 :
151 : #define eu_static_assert(expr) \
152 : extern int never_defined_just_used_for_checking[(expr) ? 1 : -1] \
153 : __attribute__ ((unused))
154 :
155 : #endif /* system.h */
|