summaryrefslogtreecommitdiffstats
path: root/src/pulsecore/core-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pulsecore/core-util.c')
-rw-r--r--src/pulsecore/core-util.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 41a31042..ad00f4f4 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -398,7 +398,15 @@ int pa_close(int fd) {
}
#endif
- return close(fd);
+ for (;;) {
+ int r;
+
+ if ((r = close(fd)) >= 0)
+ return r;
+
+ if (errno != EINTR)
+ return r;
+ }
}
/* Print a warning messages in case that the given signal is not
@@ -2041,7 +2049,7 @@ void *pa_will_need(const void *p, size_t l) {
return (void*) p;
}
- bs = PA_PAGE_ALIGN(rlim.rlim_cur);
+ bs = PA_PAGE_ALIGN((size_t) rlim.rlim_cur);
#else
bs = PA_PAGE_SIZE*4;
#endif
@@ -2383,18 +2391,29 @@ char *pa_machine_id(void) {
FILE *f;
size_t l;
+ /* The returned value is supposed be some kind of ascii identifier
+ * that is unique and stable across reboots. */
+
+ /* First we try the D-Bus UUID, which is the best option we have,
+ * since it fits perfectly our needs and is not as volatile as the
+ * hostname which might be set from dhcp. */
+
if ((f = fopen(PA_MACHINE_ID, "r"))) {
char ln[34] = "", *r;
r = fgets(ln, sizeof(ln)-1, f);
fclose(f);
- if (r)
- return pa_xstrdup(pa_strip_nl(ln));
+ pa_strip_nl(ln);
+
+ if (ln[0])
+ return pa_xstrdup(ln);
}
- l = 100;
+ /* The we fall back to the host name. It supposed to be somewhat
+ * unique, at least in a network, but may change. */
+ l = 100;
for (;;) {
char *c;
@@ -2402,17 +2421,18 @@ char *pa_machine_id(void) {
if (!pa_get_host_name(c, l)) {
- if (errno == EINVAL || errno == ENAMETOOLONG) {
+ if (errno != EINVAL && errno != ENAMETOOLONG)
+ break;
+
+ } else if (strlen(c) < l-1) {
+
+ if (*c == 0) {
pa_xfree(c);
- l *= 2;
- continue;
+ break;
}
- return NULL;
- }
-
- if (strlen(c) < l-1)
return c;
+ }
/* Hmm, the hostname is as long the space we offered the
* function, we cannot know if it fully fit in, so let's play
@@ -2421,4 +2441,9 @@ char *pa_machine_id(void) {
pa_xfree(c);
l *= 2;
}
+
+ /* If no hostname was set we use the POSIX hostid. It's usually
+ * the IPv4 address. Mit not be that stable. */
+ return pa_sprintf_malloc("%08lx", (unsigned long) gethostid);
+
}