]> code.delx.au - pulseaudio/blob - src/util.c
add dependency script
[pulseaudio] / src / util.c
1 #include <stdarg.h>
2 #include <stdlib.h>
3 #include <signal.h>
4 #include <errno.h>
5 #include <assert.h>
6 #include <string.h>
7 #include <stdio.h>
8 #include <fcntl.h>
9 #include <unistd.h>
10 #include <sys/types.h>
11
12 #include "util.h"
13
14 void pa_make_nonblock_fd(int fd) {
15 int v;
16
17 if ((v = fcntl(fd, F_GETFL)) >= 0)
18 if (!(v & O_NONBLOCK))
19 fcntl(fd, F_SETFL, v|O_NONBLOCK);
20 }
21
22 int pa_make_secure_dir(const char* dir) {
23 struct stat st;
24
25 if (mkdir(dir, 0700) < 0)
26 if (errno != EEXIST)
27 return -1;
28
29 if (lstat(dir, &st) < 0)
30 goto fail;
31
32 if (!S_ISDIR(st.st_mode) || (st.st_uid != getuid()) || ((st.st_mode & 0777) != 0700))
33 goto fail;
34
35 return 0;
36
37 fail:
38 rmdir(dir);
39 return -1;
40 }
41
42 ssize_t pa_loop_read(int fd, void*data, size_t size) {
43 ssize_t ret = 0;
44 assert(fd >= 0 && data && size);
45
46 while (size > 0) {
47 ssize_t r;
48
49 if ((r = read(fd, data, size)) < 0)
50 return r;
51
52 if (r == 0)
53 break;
54
55 ret += r;
56 data += r;
57 size -= r;
58 }
59
60 return ret;
61 }
62
63 ssize_t pa_loop_write(int fd, const void*data, size_t size) {
64 ssize_t ret = 0;
65 assert(fd >= 0 && data && size);
66
67 while (size > 0) {
68 ssize_t r;
69
70 if ((r = write(fd, data, size)) < 0)
71 return r;
72
73 if (r == 0)
74 break;
75
76 ret += r;
77 data += r;
78 size -= r;
79 }
80
81 return ret;
82 }
83
84 void pa_check_for_sigpipe(void) {
85 struct sigaction sa;
86
87 if (sigaction(SIGPIPE, NULL, &sa) < 0) {
88 fprintf(stderr, __FILE__": sigaction() failed: %s\n", strerror(errno));
89 return;
90 }
91
92 if (sa.sa_handler == SIG_DFL)
93 fprintf(stderr, "polypaudio: WARNING: SIGPIPE is not trapped. This might cause malfunction!\n");
94 }
95
96 /* The following is based on an example from the GNU libc documentation */
97 char *pa_sprintf_malloc(const char *format, ...) {
98 int size = 100;
99 char *c = NULL;
100
101 assert(format);
102
103 for(;;) {
104 int r;
105 va_list ap;
106
107 c = realloc(c, size);
108 assert(c);
109
110 va_start(ap, format);
111 r = vsnprintf(c, size, format, ap);
112 va_end(ap);
113
114 if (r > -1 && r < size)
115 return c;
116
117 if (r > -1) /* glibc 2.1 */
118 size = r+1;
119 else /* glibc 2.0 */
120 size *= 2;
121 }
122 }