]>
code.delx.au - pulseaudio/blob - src/pulse/util.c
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>
40 #ifdef HAVE_SYS_SOCKET_H
41 #include <sys/socket.h>
52 #ifdef HAVE_SYS_PRCTL_H
53 #include <sys/prctl.h>
56 #include <pulse/xmalloc.h>
57 #include <pulse/timeval.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
)) {
107 #else /* HAVE_PWD_H */
110 #endif /* HAVE_PWD_H */
113 return pa_strlcpy(s
, p
, l
);
116 char *pa_get_host_name(char *s
, size_t l
) {
121 if (gethostname(s
, l
) < 0)
128 char *pa_get_home_dir(char *s
, size_t l
) {
133 struct passwd pw
, *r
;
139 if ((e
= getenv("HOME")))
140 return pa_strlcpy(s
, e
, l
);
142 if ((e
= getenv("USERPROFILE")))
143 return pa_strlcpy(s
, e
, l
);
148 #ifdef HAVE_GETPWUID_R
149 if (getpwuid_r(getuid(), &pw
, buf
, sizeof(buf
), &r
) != 0 || !r
) {
151 /* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X)
152 * that do not support getpwuid_r. */
153 if ((r
= getpwuid(getuid())) == NULL
) {
161 return pa_strlcpy(s
, r
->pw_dir
, l
);
162 #else /* HAVE_PWD_H */
169 char *pa_get_binary_name(char *s
, size_t l
) {
174 #if defined(OS_IS_WIN32)
178 if (GetModuleFileName(NULL
, path
, PATH_MAX
))
179 return pa_strlcpy(s
, pa_path_get_filename(path
), l
);
186 /* This works on Linux only */
188 if ((rp
= pa_readlink("/proc/self/exe"))) {
189 pa_strlcpy(s
, pa_path_get_filename(rp
), l
);
197 #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
200 #ifndef TASK_COMM_LEN
201 /* Actually defined in linux/sched.h */
202 #define TASK_COMM_LEN 16
205 char tcomm
[TASK_COMM_LEN
+1];
206 memset(tcomm
, 0, sizeof(tcomm
));
208 /* This works on Linux only */
209 if (prctl(PR_GET_NAME
, (unsigned long) tcomm
, 0, 0, 0) == 0)
210 return pa_strlcpy(s
, tcomm
, l
);
219 char *pa_path_get_filename(const char *p
) {
225 if ((fn
= strrchr(p
, PA_PATH_SEP_CHAR
)))
231 char *pa_get_fqdn(char *s
, size_t l
) {
233 #ifdef HAVE_GETADDRINFO
234 struct addrinfo
*a
, hints
;
240 if (!pa_get_host_name(hn
, sizeof(hn
)))
243 #ifdef HAVE_GETADDRINFO
244 memset(&hints
, 0, sizeof(hints
));
245 hints
.ai_family
= AF_UNSPEC
;
246 hints
.ai_flags
= AI_CANONNAME
;
248 if (getaddrinfo(hn
, NULL
, &hints
, &a
) < 0 || !a
|| !a
->ai_canonname
|| !*a
->ai_canonname
)
249 return pa_strlcpy(s
, hn
, l
);
251 pa_strlcpy(s
, a
->ai_canonname
, l
);
255 return pa_strlcpy(s
, hn
, l
);
259 int pa_msleep(unsigned long t
) {
263 #elif defined(HAVE_NANOSLEEP)
266 ts
.tv_sec
= (time_t) (t
/ PA_MSEC_PER_SEC
);
267 ts
.tv_nsec
= (long) ((t
% PA_MSEC_PER_SEC
) * PA_NSEC_PER_MSEC
);
269 return nanosleep(&ts
, NULL
);
271 #error "Platform lacks a sleep function."