Branch data Line data Source code
1 : : #ifndef foocoreutilhfoo
2 : : #define foocoreutilhfoo
3 : :
4 : : /***
5 : : This file is part of PulseAudio.
6 : :
7 : : Copyright 2004-2006 Lennart Poettering
8 : : Copyright 2006-2007 Pierre Ossman <ossman@cendio.se> for Cendio AB
9 : :
10 : : PulseAudio is free software; you can redistribute it and/or modify
11 : : it under the terms of the GNU Lesser General Public License as
12 : : published by the Free Software Foundation; either version 2.1 of the
13 : : License, or (at your option) any later version.
14 : :
15 : : PulseAudio is distributed in the hope that it will be useful, but
16 : : WITHOUT ANY WARRANTY; without even the implied warranty of
17 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 : : Lesser General Public License for more details.
19 : :
20 : : You should have received a copy of the GNU Lesser General Public
21 : : License along with PulseAudio; if not, write to the Free Software
22 : : Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
23 : : USA.
24 : : ***/
25 : :
26 : : #include <sys/types.h>
27 : : #include <inttypes.h>
28 : : #include <stdarg.h>
29 : : #include <stdio.h>
30 : : #include <string.h>
31 : :
32 : : #ifdef HAVE_SYS_RESOURCE_H
33 : : #include <sys/resource.h>
34 : : #endif
35 : :
36 : : #include <pulse/gccmacro.h>
37 : : #include <pulsecore/macro.h>
38 : : #include <pulsecore/socket.h>
39 : :
40 : : #ifndef PACKAGE
41 : : #error "Please include config.h before including this file!"
42 : : #endif
43 : :
44 : : struct timeval;
45 : :
46 : : /* These resource limits are pretty new on Linux, let's define them
47 : : * here manually, in case the kernel is newer than the glibc */
48 : : #if !defined(RLIMIT_NICE) && defined(__linux__)
49 : : #define RLIMIT_NICE 13
50 : : #endif
51 : : #if !defined(RLIMIT_RTPRIO) && defined(__linux__)
52 : : #define RLIMIT_RTPRIO 14
53 : : #endif
54 : : #if !defined(RLIMIT_RTTIME) && defined(__linux__)
55 : : #define RLIMIT_RTTIME 15
56 : : #endif
57 : :
58 : : void pa_make_fd_nonblock(int fd);
59 : : void pa_make_fd_cloexec(int fd);
60 : :
61 : : int pa_make_secure_dir(const char* dir, mode_t m, uid_t uid, gid_t gid, pa_bool_t update_perms);
62 : : int pa_make_secure_parent_dir(const char *fn, mode_t, uid_t uid, gid_t gid, pa_bool_t update_perms);
63 : :
64 : : ssize_t pa_read(int fd, void *buf, size_t count, int *type);
65 : : ssize_t pa_write(int fd, const void *buf, size_t count, int *type);
66 : : ssize_t pa_loop_read(int fd, void*data, size_t size, int *type);
67 : : ssize_t pa_loop_write(int fd, const void*data, size_t size, int *type);
68 : :
69 : : int pa_close(int fd);
70 : :
71 : : void pa_check_signal_is_blocked(int sig);
72 : :
73 : : char *pa_sprintf_malloc(const char *format, ...) PA_GCC_PRINTF_ATTR(1,2);
74 : : char *pa_vsprintf_malloc(const char *format, va_list ap);
75 : :
76 : : char *pa_strlcpy(char *b, const char *s, size_t l);
77 : :
78 : : char *pa_parent_dir(const char *fn);
79 : :
80 : : int pa_make_realtime(int rtprio);
81 : : int pa_raise_priority(int nice_level);
82 : : void pa_reset_priority(void);
83 : :
84 : : int pa_parse_boolean(const char *s) PA_GCC_PURE;
85 : :
86 : : static inline const char *pa_yes_no(pa_bool_t b) {
87 [ - + ]: 2 : return b ? "yes" : "no";
[ + - # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
88 : : }
89 : :
90 : : static inline const char *pa_strnull(const char *x) {
91 [ + - ][ # # ]: 1 : return x ? x : "(null)";
[ # # ]
92 : : }
93 : :
94 : : static inline const char *pa_strempty(const char *x) {
95 [ # # ][ # # ]: 70 : return x ? x : "";
[ # # ][ - + ]
[ # # ]
96 : : }
97 : :
98 : : static inline const char *pa_strna(const char *x) {
99 [ # # ]: 0 : return x ? x : "n/a";
[ # # # # ]
100 : : }
101 : :
102 : : char *pa_split(const char *c, const char*delimiters, const char **state);
103 : : const char *pa_split_in_place(const char *c, const char*delimiters, int *n, const char **state);
104 : : char *pa_split_spaces(const char *c, const char **state);
105 : :
106 : : char *pa_strip_nl(char *s);
107 : : char *pa_strip(char *s);
108 : :
109 : : const char *pa_sig2str(int sig) PA_GCC_PURE;
110 : :
111 : : int pa_own_uid_in_group(const char *name, gid_t *gid);
112 : : int pa_uid_in_group(uid_t uid, const char *name);
113 : : gid_t pa_get_gid_of_group(const char *name);
114 : : int pa_check_in_group(gid_t g);
115 : :
116 : : int pa_lock_fd(int fd, int b);
117 : :
118 : : int pa_lock_lockfile(const char *fn);
119 : : int pa_unlock_lockfile(const char *fn, int fd);
120 : :
121 : : char *pa_hexstr(const uint8_t* d, size_t dlength, char *s, size_t slength);
122 : : size_t pa_parsehex(const char *p, uint8_t *d, size_t dlength);
123 : :
124 : : pa_bool_t pa_startswith(const char *s, const char *pfx) PA_GCC_PURE;
125 : : pa_bool_t pa_endswith(const char *s, const char *sfx) PA_GCC_PURE;
126 : :
127 : : FILE *pa_open_config_file(const char *global, const char *local, const char *env, char **result);
128 : : char* pa_find_config_file(const char *global, const char *local, const char *env);
129 : :
130 : : char *pa_get_runtime_dir(void);
131 : : char *pa_get_state_dir(void);
132 : : char *pa_get_home_dir_malloc(void);
133 : : char *pa_get_binary_name_malloc(void);
134 : : char *pa_runtime_path(const char *fn);
135 : : char *pa_state_path(const char *fn, pa_bool_t prepend_machine_id);
136 : :
137 : : int pa_atoi(const char *s, int32_t *ret_i);
138 : : int pa_atou(const char *s, uint32_t *ret_u);
139 : : int pa_atol(const char *s, long *ret_l);
140 : : int pa_atod(const char *s, double *ret_d);
141 : :
142 : : size_t pa_snprintf(char *str, size_t size, const char *format, ...);
143 : : size_t pa_vsnprintf(char *str, size_t size, const char *format, va_list ap);
144 : :
145 : : char *pa_truncate_utf8(char *c, size_t l);
146 : :
147 : : int pa_match(const char *expr, const char *v);
148 : :
149 : : char *pa_getcwd(void);
150 : : char *pa_make_path_absolute(const char *p);
151 : : pa_bool_t pa_is_path_absolute(const char *p);
152 : :
153 : : void *pa_will_need(const void *p, size_t l);
154 : :
155 : : static inline int pa_is_power_of_two(unsigned n) {
156 : 2 : return !(n & (n - 1));
157 : : }
158 : :
159 : : static inline unsigned pa_ulog2(unsigned n) {
160 : :
161 : : if (n <= 1)
162 : : return 0;
163 : :
164 : : #if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
165 : : return 8U * (unsigned) sizeof(unsigned) - (unsigned) __builtin_clz(n) - 1;
166 : : #else
167 : : {
168 : : unsigned r = 0;
169 : :
170 : : for (;;) {
171 : : n = n >> 1;
172 : :
173 : : if (!n)
174 : : return r;
175 : :
176 : : r++;
177 : : }
178 : : }
179 : : #endif
180 : : }
181 : :
182 : : static inline unsigned pa_make_power_of_two(unsigned n) {
183 : :
184 : : if (pa_is_power_of_two(n))
185 : : return n;
186 : :
187 : : return 1U << (pa_ulog2(n) + 1);
188 : : }
189 : :
190 : : void pa_close_pipe(int fds[2]);
191 : :
192 : : char *pa_readlink(const char *p);
193 : :
194 : : int pa_close_all(int except_fd, ...);
195 : : int pa_close_allv(const int except_fds[]);
196 : : int pa_unblock_sigs(int except, ...);
197 : : int pa_unblock_sigsv(const int except[]);
198 : : int pa_reset_sigs(int except, ...);
199 : : int pa_reset_sigsv(const int except[]);
200 : :
201 : : void pa_set_env(const char *key, const char *value);
202 : : void pa_set_env_and_record(const char *key, const char *value);
203 : : void pa_unset_env_recorded(void);
204 : :
205 : : pa_bool_t pa_in_system_mode(void);
206 : :
207 : : #define pa_streq(a,b) (!strcmp((a),(b)))
208 : : pa_bool_t pa_str_in_list_spaces(const char *needle, const char *haystack);
209 : :
210 : : char *pa_get_host_name_malloc(void);
211 : : char *pa_get_user_name_malloc(void);
212 : :
213 : : char *pa_machine_id(void);
214 : : char *pa_session_id(void);
215 : : char *pa_uname_string(void);
216 : :
217 : : #ifdef HAVE_VALGRIND_MEMCHECK_H
218 : : pa_bool_t pa_in_valgrind(void);
219 : : #else
220 : : static inline pa_bool_t pa_in_valgrind(void) {
221 : : return FALSE;
222 : : }
223 : : #endif
224 : :
225 : : unsigned pa_gcd(unsigned a, unsigned b);
226 : : void pa_reduce(unsigned *num, unsigned *den);
227 : :
228 : : unsigned pa_ncpus(void);
229 : :
230 : : char *pa_replace(const char*s, const char*a, const char *b);
231 : :
232 : : /* Escapes p by inserting backslashes in front of backslashes. chars is a
233 : : * regular (i.e. NULL-terminated) string containing additional characters that
234 : : * should be escaped. chars can be NULL. The caller has to free the returned
235 : : * string. */
236 : : char *pa_escape(const char *p, const char *chars);
237 : :
238 : : /* Does regular backslash unescaping. Returns the argument p. */
239 : : char *pa_unescape(char *p);
240 : :
241 : : char *pa_realpath(const char *path);
242 : :
243 : : void pa_disable_sigpipe(void);
244 : :
245 : : void pa_xfreev(void**a);
246 : :
247 : : static inline void pa_xstrfreev(char **a) {
248 : : pa_xfreev((void**) a);
249 : : }
250 : :
251 : : char **pa_split_spaces_strv(const char *s);
252 : :
253 : : char* pa_maybe_prefix_path(const char *path, const char *prefix);
254 : :
255 : : /* Returns size of the specified pipe or 4096 on failure */
256 : : size_t pa_pipe_buf(int fd);
257 : :
258 : : void pa_reset_personality(void);
259 : :
260 : : /* We abuse __OPTIMIZE__ as a check whether we are a debug build
261 : : * or not. If we are and are run from the build tree then we
262 : : * override the search path to point to our build tree */
263 : : #if defined(__linux__) && !defined(__OPTIMIZE__)
264 : : pa_bool_t pa_run_from_build_tree(void);
265 : : #else
266 : : static inline pa_bool_t pa_run_from_build_tree(void) {return FALSE;}
267 : : #endif
268 : :
269 : : const char *pa_get_temp_dir(void);
270 : :
271 : : int pa_open_cloexec(const char *fn, int flags, mode_t mode);
272 : : int pa_socket_cloexec(int domain, int type, int protocol);
273 : : int pa_pipe_cloexec(int pipefd[2]);
274 : : int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
275 : : FILE* pa_fopen_cloexec(const char *path, const char *mode);
276 : :
277 : : void pa_nullify_stdfds(void);
278 : :
279 : : char *pa_read_line_from_file(const char *fn);
280 : : pa_bool_t pa_running_in_vm(void);
281 : :
282 : : #ifdef OS_IS_WIN32
283 : : char *pa_win32_get_toplevel(HANDLE handle);
284 : : #endif
285 : :
286 : : #endif
|