]>
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
= getenv("USER")) && !(p
= getenv("LOGNAME")) && !(p
= getenv("USERNAME"))) {
81 #ifdef HAVE_GETPWUID_R
82 if (getpwuid_r(getuid(), &pw
, buf
, sizeof(buf
), &r
) != 0 || !r
) {
84 /* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X)
85 * that do not support getpwuid_r. */
86 if ((r
= getpwuid(getuid())) == NULL
) {
88 pa_snprintf(s
, l
, "%lu", (unsigned long) getuid());
94 #elif defined(OS_IS_WIN32) /* HAVE_PWD_H */
95 DWORD size
= sizeof(buf
);
97 if (!GetUserName(buf
, &size
))
102 #else /* HAVE_PWD_H */
104 #endif /* HAVE_PWD_H */
107 return pa_strlcpy(s
, p
, l
);
110 char *pa_get_host_name(char *s
, size_t l
) {
115 if (gethostname(s
, l
) < 0) {
116 pa_log("gethostname(): %s", pa_cstrerror(errno
));
124 char *pa_get_home_dir(char *s
, size_t l
) {
129 struct passwd pw
, *r
;
135 if ((e
= getenv("HOME")))
136 return pa_strlcpy(s
, e
, l
);
138 if ((e
= getenv("USERPROFILE")))
139 return pa_strlcpy(s
, e
, l
);
142 #ifdef HAVE_GETPWUID_R
143 if (getpwuid_r(getuid(), &pw
, buf
, sizeof(buf
), &r
) != 0 || !r
) {
144 pa_log("getpwuid_r() failed");
146 /* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X)
147 * that do not support getpwuid_r. */
148 if ((r
= getpwuid(getuid())) == NULL
) {
149 pa_log("getpwuid_r() failed");
154 return pa_strlcpy(s
, r
->pw_dir
, l
);
155 #else /* HAVE_PWD_H */
160 char *pa_get_binary_name(char *s
, size_t l
) {
165 #if defined(OS_IS_WIN32)
169 if (GetModuleFileName(NULL
, path
, PATH_MAX
))
170 return pa_strlcpy(s
, pa_path_get_filename(path
), l
);
177 /* This works on Linux only */
179 if ((rp
= pa_readlink("/proc/self/exe"))) {
180 pa_strlcpy(s
, pa_path_get_filename(rp
), l
);
188 #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
191 #ifndef TASK_COMM_LEN
192 /* Actually defined in linux/sched.h */
193 #define TASK_COMM_LEN 16
196 char tcomm
[TASK_COMM_LEN
+1];
197 memset(tcomm
, 0, sizeof(tcomm
));
199 /* This works on Linux only */
200 if (prctl(PR_GET_NAME
, (unsigned long) tcomm
, 0, 0, 0) == 0)
201 return pa_strlcpy(s
, tcomm
, l
);
209 char *pa_path_get_filename(const char *p
) {
214 if ((fn
= strrchr(p
, PA_PATH_SEP_CHAR
)))
220 char *pa_get_fqdn(char *s
, size_t l
) {
222 #ifdef HAVE_GETADDRINFO
223 struct addrinfo
*a
, hints
;
229 if (!pa_get_host_name(hn
, sizeof(hn
)))
232 #ifdef HAVE_GETADDRINFO
233 memset(&hints
, 0, sizeof(hints
));
234 hints
.ai_family
= AF_UNSPEC
;
235 hints
.ai_flags
= AI_CANONNAME
;
237 if (getaddrinfo(hn
, NULL
, &hints
, &a
) < 0 || !a
|| !a
->ai_canonname
|| !*a
->ai_canonname
)
238 return pa_strlcpy(s
, hn
, l
);
240 pa_strlcpy(s
, a
->ai_canonname
, l
);
244 return pa_strlcpy(s
, hn
, l
);
248 int pa_msleep(unsigned long t
) {
252 #elif defined(HAVE_NANOSLEEP)
256 ts
.tv_nsec
= (t
% 1000) * 1000000;
258 return nanosleep(&ts
, NULL
);
260 #error "Platform lacks a sleep function."