]>
code.delx.au - pulseaudio/blob - src/pulse/util.c
4 This file is part of PulseAudio.
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as
8 published by the Free Software Foundation; either version 2.1 of the
9 License, or (at your option) any later version.
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with PulseAudio; if not, write to the Free Software
18 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 "../pulsecore/winsock.h"
58 #include <pulsecore/core-error.h>
59 #include <pulsecore/log.h>
60 #include <pulsecore/core-util.h>
70 char *pa_get_user_name(char *s
, size_t l
) {
80 if (!(p
= getenv("USER")) && !(p
= getenv("LOGNAME")) && !(p
= getenv("USERNAME"))) {
83 #ifdef HAVE_GETPWUID_R
84 if (getpwuid_r(getuid(), &pw
, buf
, sizeof(buf
), &r
) != 0 || !r
) {
86 /* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X)
87 * that do not support getpwuid_r. */
88 if ((r
= getpwuid(getuid())) == NULL
) {
90 snprintf(s
, l
, "%lu", (unsigned long) getuid());
96 #elif defined(OS_IS_WIN32) /* HAVE_PWD_H */
97 DWORD size
= sizeof(buf
);
99 if (!GetUserName(buf
, &size
))
104 #else /* HAVE_PWD_H */
106 #endif /* HAVE_PWD_H */
109 return pa_strlcpy(s
, p
, l
);
112 char *pa_get_host_name(char *s
, size_t l
) {
114 if (gethostname(s
, l
) < 0) {
115 pa_log(__FILE__
": gethostname(): %s", pa_cstrerror(errno
));
122 char *pa_get_home_dir(char *s
, size_t l
) {
127 struct passwd pw
, *r
;
132 if ((e
= getenv("HOME")))
133 return pa_strlcpy(s
, e
, l
);
135 if ((e
= getenv("USERPROFILE")))
136 return pa_strlcpy(s
, e
, l
);
139 #ifdef HAVE_GETPWUID_R
140 if (getpwuid_r(getuid(), &pw
, buf
, sizeof(buf
), &r
) != 0 || !r
) {
141 pa_log(__FILE__
": getpwuid_r() failed");
143 /* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X)
144 * that do not support getpwuid_r. */
145 if ((r
= getpwuid(getuid())) == NULL
) {
146 pa_log(__FILE__
": getpwuid_r() failed");
151 return pa_strlcpy(s
, r
->pw_dir
, l
);
152 #else /* HAVE_PWD_H */
157 char *pa_get_binary_name(char *s
, size_t l
) {
162 #if defined(OS_IS_WIN32)
166 if (GetModuleFileName(NULL
, path
, PATH_MAX
))
167 return pa_strlcpy(s
, pa_path_get_filename(path
), l
);
175 /* This works on Linux only */
177 if ((i
= readlink("/proc/self/exe", path
, sizeof(path
)-1)) >= 0) {
179 return pa_strlcpy(s
, pa_path_get_filename(path
), l
);
185 #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
188 #ifndef TASK_COMM_LEN
189 /* Actually defined in linux/sched.h */
190 #define TASK_COMM_LEN 16
193 char tcomm
[TASK_COMM_LEN
+1];
194 memset(tcomm
, 0, sizeof(tcomm
));
196 /* This works on Linux only */
197 if (prctl(PR_GET_NAME
, (unsigned long) tcomm
, 0, 0, 0) == 0)
198 return pa_strlcpy(s
, tcomm
, l
);
206 const char *pa_path_get_filename(const char *p
) {
209 if ((fn
= strrchr(p
, PATH_SEP
)))
212 return (const char*) p
;
215 char *pa_get_fqdn(char *s
, size_t l
) {
217 #ifdef HAVE_GETADDRINFO
218 struct addrinfo
*a
, hints
;
221 if (!pa_get_host_name(hn
, sizeof(hn
)))
224 #ifdef HAVE_GETADDRINFO
225 memset(&hints
, 0, sizeof(hints
));
226 hints
.ai_family
= AF_UNSPEC
;
227 hints
.ai_flags
= AI_CANONNAME
;
229 if (getaddrinfo(hn
, NULL
, &hints
, &a
) < 0 || !a
|| !a
->ai_canonname
|| !*a
->ai_canonname
)
230 return pa_strlcpy(s
, hn
, l
);
232 pa_strlcpy(s
, a
->ai_canonname
, l
);
236 return pa_strlcpy(s
, hn
, l
);
240 int pa_msleep(unsigned long t
) {
244 #elif defined(HAVE_NANOSLEEP)
248 ts
.tv_nsec
= (t
% 1000) * 1000000;
250 return nanosleep(&ts
, NULL
);
252 #error "Platform lacks a sleep function."