2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as
9 published by the Free Software Foundation; either version 2.1 of the
10 License, or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
34 #include <sys/types.h>
48 #ifdef HAVE_SYS_PRCTL_H
49 #include <sys/prctl.h>
52 #include <pulse/xmalloc.h>
53 #include <pulse/timeval.h>
55 #include <pulsecore/socket.h>
56 #include <pulsecore/core-error.h>
57 #include <pulsecore/log.h>
58 #include <pulsecore/core-util.h>
59 #include <pulsecore/macro.h>
60 #include <pulsecore/usergroup.h>
64 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")))
83 name
= pa_strlcpy(s
, p
, l
);
87 if ((r
= pa_getpwuid_malloc(getuid())) == NULL
) {
88 pa_snprintf(s
, l
, "%lu", (unsigned long) getuid());
92 name
= pa_strlcpy(s
, r
->pw_name
, l
);
95 #elif defined(OS_IS_WIN32) /* HAVE_PWD_H */
96 DWORD size
= sizeof(buf
);
98 if (!GetUserName(buf
, &size
)) {
103 name
= pa_strlcpy(s
, buf
, l
);
105 #else /* HAVE_PWD_H */
108 #endif /* HAVE_PWD_H */
114 char *pa_get_host_name(char *s
, size_t l
) {
119 if (gethostname(s
, l
) < 0)
126 char *pa_get_home_dir(char *s
, size_t l
) {
136 if ((e
= getenv("HOME")))
137 return pa_strlcpy(s
, e
, l
);
139 if ((e
= getenv("USERPROFILE")))
140 return pa_strlcpy(s
, e
, l
);
144 if ((r
= pa_getpwuid_malloc(getuid())) == NULL
) {
151 dir
= pa_strlcpy(s
, r
->pw_dir
, l
);
156 #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
);
194 if ((rp
= pa_readlink("/proc/curproc/file"))) {
195 pa_strlcpy(s
, pa_path_get_filename(rp
), l
);
202 #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
205 #ifndef TASK_COMM_LEN
206 /* Actually defined in linux/sched.h */
207 #define TASK_COMM_LEN 16
210 char tcomm
[TASK_COMM_LEN
+1];
211 memset(tcomm
, 0, sizeof(tcomm
));
213 /* This works on Linux only */
214 if (prctl(PR_GET_NAME
, (unsigned long) tcomm
, 0, 0, 0) == 0)
215 return pa_strlcpy(s
, tcomm
, l
);
224 char *pa_path_get_filename(const char *p
) {
230 if ((fn
= strrchr(p
, PA_PATH_SEP_CHAR
)))
236 char *pa_get_fqdn(char *s
, size_t l
) {
238 #ifdef HAVE_GETADDRINFO
239 struct addrinfo
*a
, hints
;
245 if (!pa_get_host_name(hn
, sizeof(hn
)))
248 #ifdef HAVE_GETADDRINFO
249 memset(&hints
, 0, sizeof(hints
));
250 hints
.ai_family
= AF_UNSPEC
;
251 hints
.ai_flags
= AI_CANONNAME
;
253 if (getaddrinfo(hn
, NULL
, &hints
, &a
) < 0 || !a
|| !a
->ai_canonname
|| !*a
->ai_canonname
)
254 return pa_strlcpy(s
, hn
, l
);
256 pa_strlcpy(s
, a
->ai_canonname
, l
);
260 return pa_strlcpy(s
, hn
, l
);
264 int pa_msleep(unsigned long t
) {
268 #elif defined(HAVE_NANOSLEEP)
271 ts
.tv_sec
= (time_t) (t
/ PA_MSEC_PER_SEC
);
272 ts
.tv_nsec
= (long) ((t
% PA_MSEC_PER_SEC
) * PA_NSEC_PER_MSEC
);
274 return nanosleep(&ts
, NULL
);
276 #error "Platform lacks a sleep function."