]>
code.delx.au - pulseaudio/blob - src/pulse/util.c
4 This file is part of PulseAudio.
6 Copyright 2004-2006 Lennart Poettering
7 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
9 PulseAudio is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as
11 published by the Free Software Foundation; either version 2.1 of the
12 License, or (at your option) any later version.
14 PulseAudio is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public
20 License along with PulseAudio; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
36 #include <sys/types.h>
42 #ifdef HAVE_SYS_SOCKET_H
43 #include <sys/socket.h>
54 #ifdef HAVE_SYS_PRCTL_H
55 #include <sys/prctl.h>
58 #include <pulse/xmalloc.h>
59 #include <pulsecore/winsock.h>
60 #include <pulsecore/core-error.h>
61 #include <pulsecore/log.h>
62 #include <pulsecore/core-util.h>
63 #include <pulsecore/macro.h>
67 char *pa_get_user_name(char *s
, size_t l
) {
78 if (!(p
= (getuid() == 0 ? "root" : NULL
)) &&
79 !(p
= getenv("USER")) &&
80 !(p
= getenv("LOGNAME")) &&
81 !(p
= getenv("USERNAME"))) {
84 #ifdef HAVE_GETPWUID_R
85 if (getpwuid_r(getuid(), &pw
, buf
, sizeof(buf
), &r
) != 0 || !r
) {
87 /* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X)
88 * that do not support getpwuid_r. */
89 if ((r
= getpwuid(getuid())) == NULL
) {
91 pa_snprintf(s
, l
, "%lu", (unsigned long) getuid());
97 #elif defined(OS_IS_WIN32) /* HAVE_PWD_H */
98 DWORD size
= sizeof(buf
);
100 if (!GetUserName(buf
, &size
))
105 #else /* HAVE_PWD_H */
107 #endif /* HAVE_PWD_H */
110 return pa_strlcpy(s
, p
, l
);
113 char *pa_get_host_name(char *s
, size_t l
) {
118 if (gethostname(s
, l
) < 0) {
119 pa_log("gethostname(): %s", pa_cstrerror(errno
));
127 char *pa_get_home_dir(char *s
, size_t l
) {
132 struct passwd pw
, *r
;
138 if ((e
= getenv("HOME")))
139 return pa_strlcpy(s
, e
, l
);
141 if ((e
= getenv("USERPROFILE")))
142 return pa_strlcpy(s
, e
, l
);
145 #ifdef HAVE_GETPWUID_R
146 if (getpwuid_r(getuid(), &pw
, buf
, sizeof(buf
), &r
) != 0 || !r
) {
147 pa_log("getpwuid_r() failed");
149 /* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X)
150 * that do not support getpwuid_r. */
151 if ((r
= getpwuid(getuid())) == NULL
) {
152 pa_log("getpwuid_r() failed");
157 return pa_strlcpy(s
, r
->pw_dir
, l
);
158 #else /* HAVE_PWD_H */
163 char *pa_get_binary_name(char *s
, size_t l
) {
168 #if defined(OS_IS_WIN32)
172 if (GetModuleFileName(NULL
, path
, PATH_MAX
))
173 return pa_strlcpy(s
, pa_path_get_filename(path
), l
);
180 /* This works on Linux only */
182 if ((rp
= pa_readlink("/proc/self/exe"))) {
183 pa_strlcpy(s
, pa_path_get_filename(rp
), l
);
191 #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
194 #ifndef TASK_COMM_LEN
195 /* Actually defined in linux/sched.h */
196 #define TASK_COMM_LEN 16
199 char tcomm
[TASK_COMM_LEN
+1];
200 memset(tcomm
, 0, sizeof(tcomm
));
202 /* This works on Linux only */
203 if (prctl(PR_GET_NAME
, (unsigned long) tcomm
, 0, 0, 0) == 0)
204 return pa_strlcpy(s
, tcomm
, l
);
212 char *pa_path_get_filename(const char *p
) {
217 if ((fn
= strrchr(p
, PA_PATH_SEP_CHAR
)))
223 char *pa_get_fqdn(char *s
, size_t l
) {
225 #ifdef HAVE_GETADDRINFO
226 struct addrinfo
*a
, hints
;
232 if (!pa_get_host_name(hn
, sizeof(hn
)))
235 #ifdef HAVE_GETADDRINFO
236 memset(&hints
, 0, sizeof(hints
));
237 hints
.ai_family
= AF_UNSPEC
;
238 hints
.ai_flags
= AI_CANONNAME
;
240 if (getaddrinfo(hn
, NULL
, &hints
, &a
) < 0 || !a
|| !a
->ai_canonname
|| !*a
->ai_canonname
)
241 return pa_strlcpy(s
, hn
, l
);
243 pa_strlcpy(s
, a
->ai_canonname
, l
);
247 return pa_strlcpy(s
, hn
, l
);
251 int pa_msleep(unsigned long t
) {
255 #elif defined(HAVE_NANOSLEEP)
259 ts
.tv_nsec
= (t
% 1000) * 1000000;
261 return nanosleep(&ts
, NULL
);
263 #error "Platform lacks a sleep function."