]>
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
37 #include <sys/types.h>
43 #ifdef HAVE_SYS_SOCKET_H
44 #include <sys/socket.h>
55 #ifdef HAVE_SYS_PRCTL_H
56 #include <sys/prctl.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>
73 char *pa_get_user_name(char *s
, size_t l
) {
84 if (!(p
= getenv("USER")) && !(p
= getenv("LOGNAME")) && !(p
= getenv("USERNAME"))) {
87 #ifdef HAVE_GETPWUID_R
88 if (getpwuid_r(getuid(), &pw
, buf
, sizeof(buf
), &r
) != 0 || !r
) {
90 /* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X)
91 * that do not support getpwuid_r. */
92 if ((r
= getpwuid(getuid())) == NULL
) {
94 pa_snprintf(s
, l
, "%lu", (unsigned long) getuid());
100 #elif defined(OS_IS_WIN32) /* HAVE_PWD_H */
101 DWORD size
= sizeof(buf
);
103 if (!GetUserName(buf
, &size
))
108 #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) {
122 pa_log("gethostname(): %s", pa_cstrerror(errno
));
130 char *pa_get_home_dir(char *s
, size_t l
) {
135 struct passwd pw
, *r
;
141 if ((e
= getenv("HOME")))
142 return pa_strlcpy(s
, e
, l
);
144 if ((e
= getenv("USERPROFILE")))
145 return pa_strlcpy(s
, e
, l
);
148 #ifdef HAVE_GETPWUID_R
149 if (getpwuid_r(getuid(), &pw
, buf
, sizeof(buf
), &r
) != 0 || !r
) {
150 pa_log("getpwuid_r() failed");
152 /* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X)
153 * that do not support getpwuid_r. */
154 if ((r
= getpwuid(getuid())) == NULL
) {
155 pa_log("getpwuid_r() failed");
160 return pa_strlcpy(s
, r
->pw_dir
, l
);
161 #else /* HAVE_PWD_H */
166 char *pa_get_binary_name(char *s
, size_t l
) {
171 #if defined(OS_IS_WIN32)
175 if (GetModuleFileName(NULL
, path
, PATH_MAX
))
176 return pa_strlcpy(s
, pa_path_get_filename(path
), l
);
184 /* This works on Linux only */
186 if ((i
= readlink("/proc/self/exe", path
, sizeof(path
)-1)) >= 0) {
188 return pa_strlcpy(s
, pa_path_get_filename(path
), l
);
194 #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
197 #ifndef TASK_COMM_LEN
198 /* Actually defined in linux/sched.h */
199 #define TASK_COMM_LEN 16
202 char tcomm
[TASK_COMM_LEN
+1];
203 memset(tcomm
, 0, sizeof(tcomm
));
205 /* This works on Linux only */
206 if (prctl(PR_GET_NAME
, (unsigned long) tcomm
, 0, 0, 0) == 0)
207 return pa_strlcpy(s
, tcomm
, l
);
215 char *pa_path_get_filename(const char *p
) {
220 if ((fn
= strrchr(p
, PATH_SEP
)))
226 char *pa_get_fqdn(char *s
, size_t l
) {
228 #ifdef HAVE_GETADDRINFO
229 struct addrinfo
*a
, hints
;
235 if (!pa_get_host_name(hn
, sizeof(hn
)))
238 #ifdef HAVE_GETADDRINFO
239 memset(&hints
, 0, sizeof(hints
));
240 hints
.ai_family
= AF_UNSPEC
;
241 hints
.ai_flags
= AI_CANONNAME
;
243 if (getaddrinfo(hn
, NULL
, &hints
, &a
) < 0 || !a
|| !a
->ai_canonname
|| !*a
->ai_canonname
)
244 return pa_strlcpy(s
, hn
, l
);
246 pa_strlcpy(s
, a
->ai_canonname
, l
);
250 return pa_strlcpy(s
, hn
, l
);
254 int pa_msleep(unsigned long t
) {
258 #elif defined(HAVE_NANOSLEEP)
262 ts
.tv_nsec
= (t
% 1000) * 1000000;
264 return nanosleep(&ts
, NULL
);
266 #error "Platform lacks a sleep function."