* split pa_cstrerror() into its own file polypcore/core-error.[ch]
authorLennart Poettering <lennart@poettering.net>
Thu, 25 May 2006 17:16:55 +0000 (17:16 +0000)
committerLennart Poettering <lennart@poettering.net>
Thu, 25 May 2006 17:16:55 +0000 (17:16 +0000)
* fix building of padsp
* remove a warning when compiling padsp.c

git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@972 fefdeb5f-60dc-0310-8127-8f9354f1896f

49 files changed:
doc/todo
src/Makefile.am
src/daemon/caps.c
src/daemon/daemon-conf.c
src/daemon/main.c
src/modules/module-alsa-source.c
src/modules/module-detect.c
src/modules/module-esound-compat-spawnfd.c
src/modules/module-esound-compat-spawnpid.c
src/modules/module-esound-sink.c
src/modules/module-jack-sink.c
src/modules/module-jack-source.c
src/modules/module-match.c
src/modules/module-mmkbd-evdev.c
src/modules/module-oss-mmap.c
src/modules/module-oss.c
src/modules/module-pipe-sink.c
src/modules/module-pipe-source.c
src/modules/module-protocol-stub.c
src/modules/module-volume-restore.c
src/modules/oss-util.c
src/modules/rtp/module-rtp-recv.c
src/modules/rtp/module-rtp-send.c
src/modules/rtp/rtp.c
src/modules/rtp/sap.c
src/polyp/client-conf.c
src/polyp/context.c
src/polyp/error.c
src/polyp/error.h
src/polyp/mainloop-signal.c
src/polyp/mainloop.c
src/polyp/util.c
src/polypcore/authkey.c
src/polypcore/cli-command.c
src/polypcore/conf-parser.c
src/polypcore/core-error.c [new file with mode: 0644]
src/polypcore/core-error.h [new file with mode: 0644]
src/polypcore/core-scache.c
src/polypcore/core-util.c
src/polypcore/iochannel.c
src/polypcore/ioline.c
src/polypcore/pid.c
src/polypcore/protocol-esound.c
src/polypcore/protocol-simple.c
src/polypcore/socket-client.c
src/polypcore/socket-server.c
src/polypcore/socket-util.c
src/utils/pacmd.c
src/utils/padsp.c

index 1d17d3c..0b78ee9 100644 (file)
--- a/doc/todo
+++ b/doc/todo
@@ -2,8 +2,6 @@
 
 Pre 0.9.0
 - add API to query the bufferattrs after stream creation
-- add proper padsp script that makes $PADSP_xxx env vars from the command line arguments, just like esddsp does
-- move pa_cstrerror() to polypcore/core-error.h
 
 Post 0.9.0:
 - alsa mmap driver
index 16b5e9e..3a8c9bb 100644 (file)
@@ -402,6 +402,7 @@ libpolyp_la_SOURCES += \
                polypcore/strbuf.c polypcore/strbuf.h \
                polypcore/strlist.c polypcore/strlist.h \
                polypcore/tagstruct.c polypcore/tagstruct.h \
+               polypcore/core-error.c polypcore/core-error.h \
                polypcore/winsock.h
 
 if OS_IS_WIN32
@@ -574,7 +575,8 @@ libpolypcore_la_SOURCES += \
                polypcore/source-output.c polypcore/source-output.h \
                polypcore/strbuf.c polypcore/strbuf.h \
                polypcore/tokenizer.c polypcore/tokenizer.h \
-               polypcore/winsock.h
+               polypcore/winsock.h \
+               polypcore/core-error.c polypcore/core-error.h
 
 if OS_IS_WIN32
 libpolypcore_la_SOURCES += \
@@ -1186,3 +1188,5 @@ install-exec-hook:
        chmod u+s $(DESTDIR)$(bindir)/polypaudio
        ln -sf pacat $(DESTDIR)$(bindir)/parec
        rm -f $(DESTDIR)$(modlibexecdir)/*.a
+
+.PHONY: utils/padsp
index 4942868..5e24da8 100644 (file)
@@ -32,7 +32,7 @@
 #include <sys/capability.h>
 #endif
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 
 #include <polypcore/log.h>
 
index 809769f..2d8d955 100644 (file)
@@ -29,9 +29,9 @@
 #include <assert.h>
 #include <unistd.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/strbuf.h>
 #include <polypcore/conf-parser.h>
index 2fadd49..b88f932 100644 (file)
 
 #include "../polypcore/winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/mainloop.h>
 #include <polyp/mainloop-signal.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core.h>
 #include <polypcore/memblock.h>
 #include <polypcore/module.h>
index c72b032..414efda 100644 (file)
@@ -34,9 +34,9 @@
 
 #include <asoundlib.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core.h>
 #include <polypcore/module.h>
 #include <polypcore/memchunk.h>
index e4f2e3f..d0a3773 100644 (file)
@@ -33,9 +33,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/modargs.h>
 #include <polypcore/log.h>
index f59e9e2..861e257 100644 (file)
@@ -28,8 +28,7 @@
 #include <string.h>
 #include <errno.h>
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/modargs.h>
 #include <polypcore/core-util.h>
index c14ce12..7b47bb0 100644 (file)
@@ -28,8 +28,7 @@
 #include <errno.h>
 #include <signal.h>
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/core-util.h>
 #include <polypcore/modargs.h>
index 7229867..53a9411 100644 (file)
@@ -33,9 +33,9 @@
 #include <unistd.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/module.h>
index db2ba03..fc2bfc4 100644 (file)
@@ -36,9 +36,9 @@
 
 #include <jack/jack.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/module.h>
index 8816fb8..ca9560a 100644 (file)
@@ -36,9 +36,9 @@
 
 #include <jack/jack.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/source.h>
 #include <polypcore/module.h>
index f68f0c6..02d75e7 100644 (file)
@@ -32,9 +32,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/core-util.h>
 #include <polypcore/modargs.h>
index d6c91e2..ee2c6bf 100644 (file)
@@ -33,9 +33,9 @@
 
 #include <linux/input.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/log.h>
 #include <polypcore/namereg.h>
index dac7d7f..5cf6228 100644 (file)
@@ -36,9 +36,9 @@
 #include <limits.h>
 #include <sys/mman.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/source.h>
index 8e21785..8872467 100644 (file)
@@ -35,9 +35,9 @@
 #include <unistd.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/source.h>
index f0569ce..01598e3 100644 (file)
@@ -33,9 +33,9 @@
 #include <unistd.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/module.h>
index 77212ce..be2a28d 100644 (file)
@@ -33,9 +33,9 @@
 #include <unistd.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/source.h>
 #include <polypcore/module.h>
index 8eba352..2b4f303 100644 (file)
@@ -42,9 +42,9 @@
 
 #include "../polypcore/winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/socket-server.h>
 #include <polypcore/socket-util.h>
index 796e43a..435f0c9 100644 (file)
@@ -32,9 +32,9 @@
 #include <stdlib.h>
 #include <ctype.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/core-util.h>
 #include <polypcore/modargs.h>
index 027921c..ff337a5 100644 (file)
@@ -34,8 +34,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 
index 8d9b33c..c448502 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
-#include <polyp/error.h>
 #include <polyp/timeval.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/llist.h>
 #include <polypcore/sink.h>
index c8b3899..4359d00 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
-#include <polyp/error.h>
 #include <polyp/timeval.h>
 #include <polyp/util.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/llist.h>
 #include <polypcore/source.h>
index 012d657..52a1819 100644 (file)
@@ -36,8 +36,7 @@
 #include <sys/filio.h>
 #endif
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/log.h>
 
 #include "rtp.h"
index 238ee42..134bab0 100644 (file)
@@ -38,9 +38,9 @@
 #include <sys/filio.h>
 #endif
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 
index 0b3154c..e1934ce 100644 (file)
@@ -29,7 +29,7 @@
 #include <errno.h>
 #include <string.h>
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/log.h>
index eb56381..68fb4bf 100644 (file)
@@ -47,7 +47,7 @@
 
 #include "../polypcore/winsock.h"
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 #include <polyp/version.h>
 #include <polyp/xmalloc.h>
 
index 0e3b506..27da7ea 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
-#ifdef HAVE_PTHREAD
-#include <pthread.h>
-#endif
-
-#ifdef HAVE_WINDOWS_H
-#include <windows.h>
-#endif
-
-#include <polyp/utf8.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/core-util.h>
 
 #include "error.h"
 
-static const char* const errortab[PA_ERR_MAX] = {
-    [PA_OK] = "OK",
-    [PA_ERR_ACCESS] = "Access denied",
-    [PA_ERR_COMMAND] = "Unknown command",
-    [PA_ERR_INVALID] = "Invalid argument",
-    [PA_ERR_EXIST] = "Entity exists",
-    [PA_ERR_NOENTITY] = "No such entity",
-    [PA_ERR_CONNECTIONREFUSED] = "Connection refused",
-    [PA_ERR_PROTOCOL] = "Protocol error",
-    [PA_ERR_TIMEOUT] = "Timeout",
-    [PA_ERR_AUTHKEY] = "No authorization key",
-    [PA_ERR_INTERNAL] = "Internal error",
-    [PA_ERR_CONNECTIONTERMINATED] = "Connection terminated",
-    [PA_ERR_KILLED] = "Entity killed",
-    [PA_ERR_INVALIDSERVER] = "Invalid server",
-    [PA_ERR_MODINITFAILED] = "Module initalization failed",
-    [PA_ERR_BADSTATE] = "Bad state",
-    [PA_ERR_NODATA] = "No data",
-    [PA_ERR_VERSION] = "Incompatible protocol version",
-    [PA_ERR_TOOLARGE] = "Too large"
-};
-
 const char*pa_strerror(int error) {
+
+    static const char* const errortab[PA_ERR_MAX] = {
+        [PA_OK] = "OK",
+        [PA_ERR_ACCESS] = "Access denied",
+        [PA_ERR_COMMAND] = "Unknown command",
+        [PA_ERR_INVALID] = "Invalid argument",
+        [PA_ERR_EXIST] = "Entity exists",
+        [PA_ERR_NOENTITY] = "No such entity",
+        [PA_ERR_CONNECTIONREFUSED] = "Connection refused",
+        [PA_ERR_PROTOCOL] = "Protocol error",
+        [PA_ERR_TIMEOUT] = "Timeout",
+        [PA_ERR_AUTHKEY] = "No authorization key",
+        [PA_ERR_INTERNAL] = "Internal error",
+        [PA_ERR_CONNECTIONTERMINATED] = "Connection terminated",
+        [PA_ERR_KILLED] = "Entity killed",
+        [PA_ERR_INVALIDSERVER] = "Invalid server",
+        [PA_ERR_MODINITFAILED] = "Module initalization failed",
+        [PA_ERR_BADSTATE] = "Bad state",
+        [PA_ERR_NODATA] = "No data",
+        [PA_ERR_VERSION] = "Incompatible protocol version",
+        [PA_ERR_TOOLARGE] = "Too large"
+    };
+
     if (error < 0 || error >= PA_ERR_MAX)
         return NULL;
 
     return errortab[error];
 }
-
-#ifdef HAVE_PTHREAD
-
-static pthread_once_t cstrerror_once = PTHREAD_ONCE_INIT;
-static pthread_key_t tlsstr_key;
-
-static void inittls(void) {
-    int ret;
-
-    ret = pthread_key_create(&tlsstr_key, pa_xfree);
-    if (ret) {
-        fprintf(stderr, __FILE__ ": CRITICAL: Unable to allocate TLS key (%d)\n", errno);
-        exit(-1);
-    }
-}
-
-#elif HAVE_WINDOWS_H
-
-static DWORD tlsstr_key = TLS_OUT_OF_INDEXES;
-static DWORD monitor_key = TLS_OUT_OF_INDEXES;
-
-static void inittls(void) {
-    HANDLE mutex;
-    char name[64];
-
-    sprintf(name, "polypaudio%d", (int)GetCurrentProcessId());
-
-    mutex = CreateMutex(NULL, FALSE, name);
-    if (!mutex) {
-        fprintf(stderr, __FILE__ ": CRITICAL: Unable to create named mutex (%d)\n", (int)GetLastError());
-        exit(-1);
-    }
-
-    WaitForSingleObject(mutex, INFINITE);
-
-    if (tlsstr_key == TLS_OUT_OF_INDEXES) {
-        tlsstr_key = TlsAlloc();
-        monitor_key = TlsAlloc();
-        if ((tlsstr_key == TLS_OUT_OF_INDEXES) || (monitor_key == TLS_OUT_OF_INDEXES)) {
-            fprintf(stderr, __FILE__ ": CRITICAL: Unable to allocate TLS key (%d)\n", (int)GetLastError());
-            exit(-1);
-        }
-    }
-
-    ReleaseMutex(mutex);
-
-    CloseHandle(mutex);
-}
-
-/*
- * This is incredibly brain dead, but this is necessary when dealing with
- * the hell that is Win32.
- */
-struct monitor_data {
-    HANDLE thread;
-    void *data;
-};
-
-static DWORD WINAPI monitor_thread(LPVOID param) {
-    struct monitor_data *data;
-
-    data = (struct monitor_data*)param;
-    assert(data);
-
-    WaitForSingleObject(data->thread, INFINITE);
-
-    CloseHandle(data->thread);
-    pa_xfree(data->data);
-    pa_xfree(data);
-
-    return 0;
-}
-
-static void start_monitor(void) {
-    HANDLE thread;
-    struct monitor_data *data;
-
-    data = pa_xnew(struct monitor_data, 1);
-    assert(data);
-
-    DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
-        GetCurrentProcess(), &data->thread, 0, FALSE, DUPLICATE_SAME_ACCESS);
-
-    thread = CreateThread(NULL, 0, monitor_thread, data, 0, NULL);
-    assert(thread);
-
-    TlsSetValue(monitor_key, data);
-
-    CloseHandle(thread);
-}
-
-#else
-
-/* Unsafe, but we have no choice */
-static char *tlsstr;
-
-#endif
-
-const char* pa_cstrerror(int errnum) {
-    const char *origbuf;
-
-#ifdef HAVE_STRERROR_R
-    char errbuf[128];
-#endif
-
-#ifdef HAVE_PTHREAD
-    char *tlsstr;
-
-    pthread_once(&cstrerror_once, inittls);
-
-    tlsstr = pthread_getspecific(tlsstr_key);
-#elif defined(HAVE_WINDOWS_H)
-    char *tlsstr;
-    struct monitor_data *data;
-
-    inittls();
-
-    tlsstr = TlsGetValue(tlsstr_key);
-    if (!tlsstr)
-        start_monitor();
-    data = TlsGetValue(monitor_key);
-#endif
-
-    if (tlsstr)
-        pa_xfree(tlsstr);
-
-#ifdef HAVE_STRERROR_R
-
-#ifdef __GLIBC__
-    origbuf = strerror_r(errnum, errbuf, sizeof(errbuf));
-    if (origbuf == NULL)
-        origbuf = "";
-#else
-    if (strerror_r(errnum, errbuf, sizeof(errbuf)) == 0) {
-        origbuf = errbuf;
-        errbuf[sizeof(errbuf) - 1] = '\0';
-    } else
-        origbuf = "";
-#endif
-
-#else
-    /* This might not be thread safe, but we hope for the best */
-    origbuf = strerror(errnum);
-#endif
-
-    tlsstr = pa_locale_to_utf8(origbuf);
-    if (!tlsstr) {
-        fprintf(stderr, "Unable to convert, filtering\n");
-        tlsstr = pa_utf8_filter(origbuf);
-    }
-
-#ifdef HAVE_PTHREAD
-    pthread_setspecific(tlsstr_key, tlsstr);
-#elif defined(HAVE_WINDOWS_H)
-    TlsSetValue(tlsstr_key, tlsstr);
-    data->data = tlsstr;
-#endif
-
-    return tlsstr;
-}
index 1d7b2ca..9856c1a 100644 (file)
@@ -33,12 +33,6 @@ PA_C_DECL_BEGIN
 /** Return a human readable error message for the specified numeric error code */
 const char* pa_strerror(int error);
 
-/** A wrapper around the standard strerror() function that converts the
- * string to UTF-8. The function is thread safe but the returned string is
- * only guaranteed to exist until the thread exits or pa_cstrerror() is
- * called again from the same thread. */
-const char* pa_cstrerror(int errnum);
-
 PA_C_DECL_END
 
 #endif
index c6ad431..9270281 100644 (file)
@@ -36,7 +36,7 @@
 #include <windows.h>
 #endif
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/core-util.h>
index 6088fa4..61d8b48 100644 (file)
@@ -44,7 +44,7 @@
 #include "../polypcore/pipe.h"
 #endif
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 #include <polyp/timeval.h>
 #include <polyp/xmalloc.h>
 
index 9105448..842b9e7 100644 (file)
@@ -51,8 +51,7 @@
 
 #include "../polypcore/winsock.h"
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/log.h>
 #include <polypcore/core-util.h>
 
index 6b462a2..54f4dd8 100644 (file)
@@ -35,8 +35,8 @@
 #include <limits.h>
 #include <sys/stat.h>
 
-#include <polyp/error.h>
 #include <polyp/util.h>
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 #include <polypcore/random.h>
index 039aa95..e25e464 100644 (file)
@@ -29,7 +29,6 @@
 #include <stdlib.h>
 #include <errno.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/module.h>
@@ -50,6 +49,7 @@
 #include <polypcore/sound-file-stream.h>
 #include <polypcore/props.h>
 #include <polypcore/core-util.h>
+#include <polypcore/core-error.h>
 
 #include "cli-command.h"
 
index 4bcb83d..d59bc55 100644 (file)
@@ -28,9 +28,9 @@
 #include <stdio.h>
 #include <errno.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/log.h>
 #include <polypcore/core-util.h>
 
diff --git a/src/polypcore/core-error.c b/src/polypcore/core-error.c
new file mode 100644 (file)
index 0000000..f2240a9
--- /dev/null
@@ -0,0 +1,205 @@
+/* $Id$ */
+
+/***
+  This file is part of polypaudio.
+  polypaudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+  polypaudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+  You should have received a copy of the GNU Lesser General Public License
+  along with polypaudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+#endif
+
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
+#include <polyp/utf8.h>
+#include <polyp/xmalloc.h>
+
+#include <polypcore/core-util.h>
+#include <polypcore/native-common.h>
+
+#include "core-error.h"
+
+#ifdef HAVE_PTHREAD
+
+static pthread_once_t cstrerror_once = PTHREAD_ONCE_INIT;
+static pthread_key_t tlsstr_key;
+
+static void inittls(void) {
+    int ret;
+
+    ret = pthread_key_create(&tlsstr_key, pa_xfree);
+    if (ret) {
+        fprintf(stderr, __FILE__ ": CRITICAL: Unable to allocate TLS key (%d)\n", errno);
+        exit(-1);
+    }
+}
+
+#elif HAVE_WINDOWS_H
+
+static DWORD tlsstr_key = TLS_OUT_OF_INDEXES;
+static DWORD monitor_key = TLS_OUT_OF_INDEXES;
+
+static void inittls(void) {
+    HANDLE mutex;
+    char name[64];
+
+    sprintf(name, "polypaudio%d", (int)GetCurrentProcessId());
+
+    mutex = CreateMutex(NULL, FALSE, name);
+    if (!mutex) {
+        fprintf(stderr, __FILE__ ": CRITICAL: Unable to create named mutex (%d)\n", (int)GetLastError());
+        exit(-1);
+    }
+
+    WaitForSingleObject(mutex, INFINITE);
+
+    if (tlsstr_key == TLS_OUT_OF_INDEXES) {
+        tlsstr_key = TlsAlloc();
+        monitor_key = TlsAlloc();
+        if ((tlsstr_key == TLS_OUT_OF_INDEXES) || (monitor_key == TLS_OUT_OF_INDEXES)) {
+            fprintf(stderr, __FILE__ ": CRITICAL: Unable to allocate TLS key (%d)\n", (int)GetLastError());
+            exit(-1);
+        }
+    }
+
+    ReleaseMutex(mutex);
+
+    CloseHandle(mutex);
+}
+
+/*
+ * This is incredibly brain dead, but this is necessary when dealing with
+ * the hell that is Win32.
+ */
+struct monitor_data {
+    HANDLE thread;
+    void *data;
+};
+
+static DWORD WINAPI monitor_thread(LPVOID param) {
+    struct monitor_data *data;
+
+    data = (struct monitor_data*)param;
+    assert(data);
+
+    WaitForSingleObject(data->thread, INFINITE);
+
+    CloseHandle(data->thread);
+    pa_xfree(data->data);
+    pa_xfree(data);
+
+    return 0;
+}
+
+static void start_monitor(void) {
+    HANDLE thread;
+    struct monitor_data *data;
+
+    data = pa_xnew(struct monitor_data, 1);
+    assert(data);
+
+    DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
+        GetCurrentProcess(), &data->thread, 0, FALSE, DUPLICATE_SAME_ACCESS);
+
+    thread = CreateThread(NULL, 0, monitor_thread, data, 0, NULL);
+    assert(thread);
+
+    TlsSetValue(monitor_key, data);
+
+    CloseHandle(thread);
+}
+
+#else
+
+/* Unsafe, but we have no choice */
+static char *tlsstr;
+
+#endif
+
+const char* pa_cstrerror(int errnum) {
+    const char *origbuf;
+
+#ifdef HAVE_STRERROR_R
+    char errbuf[128];
+#endif
+
+#ifdef HAVE_PTHREAD
+    char *tlsstr;
+
+    pthread_once(&cstrerror_once, inittls);
+
+    tlsstr = pthread_getspecific(tlsstr_key);
+#elif defined(HAVE_WINDOWS_H)
+    char *tlsstr;
+    struct monitor_data *data;
+
+    inittls();
+
+    tlsstr = TlsGetValue(tlsstr_key);
+    if (!tlsstr)
+        start_monitor();
+    data = TlsGetValue(monitor_key);
+#endif
+
+    if (tlsstr)
+        pa_xfree(tlsstr);
+
+#ifdef HAVE_STRERROR_R
+
+#ifdef __GLIBC__
+    origbuf = strerror_r(errnum, errbuf, sizeof(errbuf));
+    if (origbuf == NULL)
+        origbuf = "";
+#else
+    if (strerror_r(errnum, errbuf, sizeof(errbuf)) == 0) {
+        origbuf = errbuf;
+        errbuf[sizeof(errbuf) - 1] = '\0';
+    } else
+        origbuf = "";
+#endif
+
+#else
+    /* This might not be thread safe, but we hope for the best */
+    origbuf = strerror(errnum);
+#endif
+
+    tlsstr = pa_locale_to_utf8(origbuf);
+    if (!tlsstr) {
+        fprintf(stderr, "Unable to convert, filtering\n");
+        tlsstr = pa_utf8_filter(origbuf);
+    }
+
+#ifdef HAVE_PTHREAD
+    pthread_setspecific(tlsstr_key, tlsstr);
+#elif defined(HAVE_WINDOWS_H)
+    TlsSetValue(tlsstr_key, tlsstr);
+    data->data = tlsstr;
+#endif
+
+    return tlsstr;
+}
diff --git a/src/polypcore/core-error.h b/src/polypcore/core-error.h
new file mode 100644 (file)
index 0000000..17595c9
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef foocoreerrorhfoo
+#define foocoreerrorhfoo
+
+/* $Id$ */
+
+/***
+  This file is part of polypaudio.
+  polypaudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+  polypaudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+  You should have received a copy of the GNU Lesser General Public License
+  along with polypaudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#include <inttypes.h>
+#include <polyp/cdecl.h>
+
+/** \file
+ * Error management */
+
+PA_C_DECL_BEGIN
+
+/** A wrapper around the standard strerror() function that converts the
+ * string to UTF-8. The function is thread safe but the returned string is
+ * only guaranteed to exist until the thread exits or pa_cstrerror() is
+ * called again from the same thread. */
+const char* pa_cstrerror(int errnum);
+
+PA_C_DECL_END
+
+#endif
index 1d60a91..b44a7e1 100644 (file)
@@ -41,7 +41,6 @@
 #include <windows.h>
 #endif
 
-#include <polyp/error.h>
 #include <polyp/mainloop.h>
 #include <polyp/channelmap.h>
 #include <polyp/timeval.h>
@@ -57,6 +56,7 @@
 #include <polypcore/sound-file.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
+#include <polypcore/core-error.h>
 
 #include "core-scache.h"
 
index bb6a3d8..6cf281c 100644 (file)
 
 #include <samplerate.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 #include <polyp/util.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/winsock.h>
 #include <polypcore/log.h>
 
index 8af6a36..106c413 100644 (file)
@@ -38,9 +38,9 @@
 
 #include "winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/socket-util.h>
 #include <polypcore/log.h>
index 2e0a3e1..6a2ef33 100644 (file)
@@ -29,9 +29,9 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/log.h>
 
 #include "ioline.h"
index b8f5395..a5c0ef0 100644 (file)
@@ -39,9 +39,9 @@
 #include <windows.h>
 #endif
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 
index d7c9475..02e140b 100644 (file)
@@ -30,7 +30,6 @@
 #include <stdlib.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/sample.h>
 #include <polyp/timeval.h>
 #include <polyp/utf8.h>
@@ -49,6 +48,7 @@
 #include <polypcore/namereg.h>
 #include <polypcore/log.h>
 #include <polypcore/core-util.h>
+#include <polypcore/core-error.h>
 
 #include "endianmacros.h"
 
index f15f882..8b319d7 100644 (file)
@@ -30,7 +30,6 @@
 #include <errno.h>
 #include <string.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/sink-input.h>
@@ -39,6 +38,7 @@
 #include <polypcore/sample-util.h>
 #include <polypcore/namereg.h>
 #include <polypcore/log.h>
+#include <polypcore/core-error.h>
 
 #include "protocol-simple.h"
 
index aa88575..fd840ab 100644 (file)
 
 #include "winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/timeval.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/socket-util.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
index 871fac1..17071ec 100644 (file)
 
 #include <polyp/xmalloc.h>
 #include <polyp/util.h>
-#include <polyp/error.h>
 
 #include <polypcore/socket-util.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
+#include <polypcore/core-error.h>
 
 #include "socket-server.h"
 
index 06cdc62..aefcb5e 100644 (file)
@@ -59,9 +59,9 @@
 
 #include "winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 
index 351d79d..ad50c77 100644 (file)
@@ -54,7 +54,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
     }
 
     if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
-        pa_log(__FILE__": socket(PF_UNIX, SOCK_STREAM, 0): %s", pa_cstrerror(errno));
+        pa_log(__FILE__": socket(PF_UNIX, SOCK_STREAM, 0): %s", strerror(errno));
         goto fail;
     }
 
@@ -66,7 +66,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
         int r;
         
         if ((r = connect(fd, (struct sockaddr*) &sa, sizeof(sa))) < 0 && (errno != ECONNREFUSED && errno != ENOENT)) {
-            pa_log(__FILE__": connect(): %s", pa_cstrerror(errno));
+            pa_log(__FILE__": connect(): %s", strerror(errno));
             goto fail;
         }
             
@@ -97,7 +97,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
     
     for (;;) {
         if (select(FD_SETSIZE, &ifds, &ofds, NULL, NULL) < 0) {
-            pa_log(__FILE__": select(): %s", pa_cstrerror(errno));
+            pa_log(__FILE__": select(): %s", strerror(errno));
             goto fail;
         }
 
@@ -109,7 +109,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
                 if (r == 0)
                     break;
                 
-                pa_log(__FILE__": read(): %s", pa_cstrerror(errno));
+                pa_log(__FILE__": read(): %s", strerror(errno));
                 goto fail;
             }
             
@@ -125,7 +125,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
                 if (r == 0)
                     break;
                 
-                pa_log(__FILE__": read(): %s", pa_cstrerror(errno));
+                pa_log(__FILE__": read(): %s", strerror(errno));
                 goto fail;
             }
 
@@ -138,7 +138,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
             assert(obuf_length);
             
             if ((r = write(1, obuf + obuf_index, obuf_length)) < 0) {
-                pa_log(__FILE__": write(): %s", pa_cstrerror(errno));
+                pa_log(__FILE__": write(): %s", strerror(errno));
                 goto fail;
             }
             
@@ -152,7 +152,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
             assert(ibuf_length);
             
             if ((r = write(fd, ibuf + ibuf_index, ibuf_length)) < 0) {
-                pa_log(__FILE__": write(): %s", pa_cstrerror(errno));
+                pa_log(__FILE__": write(): %s", strerror(errno));
                 goto fail;
             }
             
index 5987ec5..c1cc9c9 100644 (file)
@@ -361,7 +361,7 @@ static void reset_params(fd_info *i) {
     i->n_fragments = 0;
 }
 
-static char *client_name(char *buf, size_t n) {
+static const char *client_name(char *buf, size_t n) {
     char p[PATH_MAX];
     const char *e;
 
@@ -376,7 +376,7 @@ static char *client_name(char *buf, size_t n) {
     return buf;
 }
 
-static char *stream_name(void) {
+static const char *stream_name(void) {
     const char *e;
 
     if ((e = getenv("PADSP_STREAM_NAME")))