]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-program-client: Change program_client_run*() to return enum program_client_exit_s...
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 18 Feb 2021 10:41:51 +0000 (12:41 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 12 May 2021 10:32:10 +0000 (10:32 +0000)
Their behavior is clearer when result is expressed as enum than int.

src/director/director.c
src/lib-program-client/program-client.c
src/lib-program-client/program-client.h
src/lib-program-client/test-program-client-net.c
src/lib-program-client/test-program-client-unix.c
src/lib-smtp/smtp-submit.c

index ef7c87f6f940da705044bcaed57c50f77b142407..317cff1fbe00f7ba7d2d05a197b9dcc22f88c16c 100644 (file)
@@ -788,7 +788,8 @@ void director_update_user_weak(struct director *dir, struct director_host *src,
 }
 
 static void
-director_flush_user_continue(int result, struct director_kill_context *ctx)
+director_flush_user_continue(enum program_client_exit_status result,
+                            struct director_kill_context *ctx)
 {
        struct director *dir = ctx->dir;
        ctx->callback_pending = FALSE;
@@ -796,7 +797,7 @@ director_flush_user_continue(int result, struct director_kill_context *ctx)
        struct user *user = user_directory_lookup(ctx->tag->users,
                                                  ctx->username_hash);
 
-       if (result == 0) {
+       if (result == PROGRAM_CLIENT_EXIT_STATUS_FAILURE) {
                struct istream *is = iostream_temp_finish(&ctx->reply, SIZE_MAX);
                char *data;
                i_stream_set_return_partial_line(is, TRUE);
@@ -828,7 +829,8 @@ director_flush_user_continue(int result, struct director_kill_context *ctx)
                /* ctx is freed later via user->kill_ctx */
                e_debug(dir->event, "Flushing user %u finished, result=%d",
                        ctx->username_hash, result);
-               director_user_kill_finish_delayed(dir, user, result == 1);
+               director_user_kill_finish_delayed(dir, user,
+                       result == PROGRAM_CLIENT_EXIT_STATUS_SUCCESS);
        }
 }
 
@@ -898,7 +900,8 @@ director_flush_user(struct director *dir, struct user *user)
                        user->username_hash,
                        user->host->ip_str,
                        error);
-               director_flush_user_continue(0, ctx);
+               director_flush_user_continue(PROGRAM_CLIENT_EXIT_STATUS_FAILURE,
+                                            ctx);
                return;
        }
 
index 246eea6ef6e97601182cef5f3fc6884205a933f6..c6c6ff6ff5bde3ff0d7be4ab4cc5a5f432f90512 100644 (file)
@@ -141,7 +141,8 @@ void program_client_disconnected(struct program_client *pclient)
 
        program_client_callback(pclient,
                (pclient->error != PROGRAM_CLIENT_ERROR_NONE ?
-                       -1 : (int)pclient->exit_status),
+                       PROGRAM_CLIENT_EXIT_STATUS_INTERNAL_FAILURE :
+                       pclient->exit_status),
                pclient->context);
 }
 
@@ -723,7 +724,7 @@ int program_client_run(struct program_client *pclient)
        if (pclient->error != PROGRAM_CLIENT_ERROR_NONE)
                return -1;
 
-       return (int)pclient->exit_status;
+       return pclient->exit_status;
 }
 
 #undef program_client_run_async
index 2aaad3e0878104381f5ccefeea6edaf36489ca09..ce6cdf91ebe8aa1e94caa8675e02452807f7df47 100644 (file)
@@ -37,7 +37,8 @@ struct program_client_settings {
 };
 
 typedef void program_client_fd_callback_t(void *context, struct istream *input);
-typedef void program_client_callback_t(int, void *);
+typedef void program_client_callback_t(enum program_client_exit_status status,
+                                      void *context);
 
 struct program_client *
 program_client_local_create(const char *bin_path, const char *const *args,
@@ -88,14 +89,13 @@ void program_client_set_extra_fd(struct program_client *pclient, int fd,
 void program_client_set_env(struct program_client *pclient,
        const char *name, const char *value);
 
-/* Since script service cannot return system exit code, the exit value shall be
-   -1, 0, or 1. -1 is internal error, 0 is failure and 1 is success */
-int program_client_run(struct program_client *pclient);
+enum program_client_exit_status
+program_client_run(struct program_client *pclient);
 void program_client_run_async(struct program_client *pclient,
                              program_client_callback_t *, void*);
 #define program_client_run_async(pclient, callback, context) \
        program_client_run_async(pclient, (program_client_callback_t*)callback, \
-               (char*)context - CALLBACK_TYPECHECK(callback, \
-                       void (*)(int, typeof(context))))
+               1 ? context : CALLBACK_TYPECHECK(callback, \
+                       void (*)(enum program_client_exit_status, typeof(context))))
 
 #endif
index 9aa424680bcb822225bfe85c0be718f818858767..ed7d68db79aa76fd623f04b2655e73ac7bddec6e 100644 (file)
@@ -316,9 +316,10 @@ static void test_program_teardown(void)
        test_end();
 }
 
-static void test_program_async_callback(int result, int *ret)
+static void test_program_async_callback(enum program_client_exit_status result,
+                                       int *ret)
 {
-       *ret = result;
+       *ret = (int)result;
        test_program_io_loop_stop();
 }
 
index 29658139719119f0a3f1fed3ba3a9e023a8511ba..e524c887e3c7e4b4deb5285015fc57aa9542b9f8 100644 (file)
@@ -265,9 +265,10 @@ static void test_program_teardown(void)
        test_end();
 }
 
-static void test_program_async_callback(int result, int *ret)
+static void test_program_async_callback(enum program_client_exit_status result,
+                                       int *ret)
 {
-       *ret = result;
+       *ret = (int)result;
        io_loop_stop(current_ioloop);
 }
 
index 9e7c13f9cc0164f30adde431fa66da3d5972b6d5..0328b95488c0602795144fe5960c52865dc928b4 100644 (file)
@@ -366,14 +366,15 @@ smtp_submit_send_host(struct smtp_submit *subm)
 }
 
 static void
-smtp_submit_sendmail_callback(int status, struct smtp_submit *subm)
+smtp_submit_sendmail_callback(enum program_client_exit_status status,
+                             struct smtp_submit *subm)
 {
-       if (status < 0) {
+       if (status == PROGRAM_CLIENT_EXIT_STATUS_INTERNAL_FAILURE) {
                smtp_submit_callback(subm, -1,
                        "Failed to execute sendmail");
                return;
        }
-       if (status == 0) {
+       if (status == PROGRAM_CLIENT_EXIT_STATUS_FAILURE) {
                smtp_submit_callback(subm, -1,
                        "Sendmail program returned error");
                return;