[pulseaudio-discuss] [PATCH 3/4] context: Always return a valid error code from pa_context_connect() on failure.

Tanu Kaskinen tanuk at iki.fi
Sun Jan 1 10:25:08 PST 2012


---
 src/pulse/context.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/pulse/context.c b/src/pulse/context.c
index e03d88c..4d28350 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -657,12 +657,14 @@ static int context_autospawn(pa_context *c) {
     if (sigaction(SIGCHLD, NULL, &sa) < 0) {
         pa_log_debug("sigaction() failed: %s", pa_cstrerror(errno));
         pa_context_fail(c, PA_ERR_INTERNAL);
+        r = -PA_ERR_INTERNAL;
         goto fail;
     }
 
     if ((sa.sa_flags & SA_NOCLDWAIT) || sa.sa_handler == SIG_IGN) {
         pa_log_debug("Process disabled waitpid(), cannot autospawn.");
         pa_context_fail(c, PA_ERR_CONNECTIONREFUSED);
+        r = -PA_ERR_CONNECTIONREFUSED;
         goto fail;
     }
 
@@ -674,6 +676,7 @@ static int context_autospawn(pa_context *c) {
     if ((pid = fork()) < 0) {
         pa_log_error(_("fork(): %s"), pa_cstrerror(errno));
         pa_context_fail(c, PA_ERR_INTERNAL);
+        r = -PA_ERR_INTERNAL;
 
         if (c->spawn_api.postfork)
             c->spawn_api.postfork();
@@ -729,6 +732,7 @@ static int context_autospawn(pa_context *c) {
         if (errno != ESRCH) {
             pa_log(_("waitpid(): %s"), pa_cstrerror(errno));
             pa_context_fail(c, PA_ERR_INTERNAL);
+            r = -PA_ERR_INTERNAL;
             goto fail;
         }
 
@@ -737,6 +741,7 @@ static int context_autospawn(pa_context *c) {
 
     } else if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
         pa_context_fail(c, PA_ERR_CONNECTIONREFUSED);
+        r = -PA_ERR_CONNECTIONREFUSED;
         goto fail;
     }
 
@@ -748,7 +753,7 @@ fail:
 
     pa_context_unref(c);
 
-    return -1;
+    return r;
 }
 
 #endif /* OS_IS_WIN32 */
@@ -797,7 +802,7 @@ fail:
 
 static int try_next_connection(pa_context *c) {
     char *u = NULL;
-    int r = -1;
+    int r = 0;
 
     pa_assert(c);
     pa_assert(!c->client);
@@ -833,10 +838,17 @@ static int try_next_connection(pa_context *c) {
                     track_pulseaudio_on_dbus(c, DBUS_BUS_SESSION, &c->session_bus);
                 if (!c->system_bus)
                     track_pulseaudio_on_dbus(c, DBUS_BUS_SYSTEM, &c->system_bus);
+                /* XXX: If the track_pulseaudio_on_dbus() calls fail, then the
+                 * context will wait in the PA_CONTEXT_CONNECTING state
+                 * forever. OTOH, that's anyway the case if it happens that no
+                 * daemon ever appears on either bus, so maybe it's not so
+                 * serious? */
             } else
 #endif
                 pa_context_fail(c, PA_ERR_CONNECTIONREFUSED);
 
+            r = -PA_ERR_CONNECTIONREFUSED;
+
             goto finish;
         }
 
@@ -853,8 +865,6 @@ static int try_next_connection(pa_context *c) {
         break;
     }
 
-    r = 0;
-
 finish:
     pa_xfree(u);
 
@@ -958,6 +968,7 @@ int pa_context_connect(
     if (server) {
         if (!(c->server_list = pa_strlist_parse(server))) {
             pa_context_fail(c, PA_ERR_INVALIDSERVER);
+            r = -PA_ERR_INVALIDSERVER;
             goto finish;
         }
 
-- 
1.7.7.3



More information about the pulseaudio-discuss mailing list