From: Timo Sirainen Date: Thu, 18 Feb 2021 10:41:51 +0000 (+0200) Subject: lib-program-client: Change program_client_run*() to return enum program_client_exit_s... X-Git-Tag: 2.3.16~147 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b04d1a4a716ea7913e29245751d5239438837cd6;p=thirdparty%2Fdovecot%2Fcore.git lib-program-client: Change program_client_run*() to return enum program_client_exit_status Their behavior is clearer when result is expressed as enum than int. --- diff --git a/src/director/director.c b/src/director/director.c index ef7c87f6f9..317cff1fbe 100644 --- a/src/director/director.c +++ b/src/director/director.c @@ -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; } diff --git a/src/lib-program-client/program-client.c b/src/lib-program-client/program-client.c index 246eea6ef6..c6c6ff6ff5 100644 --- a/src/lib-program-client/program-client.c +++ b/src/lib-program-client/program-client.c @@ -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 diff --git a/src/lib-program-client/program-client.h b/src/lib-program-client/program-client.h index 2aaad3e087..ce6cdf91eb 100644 --- a/src/lib-program-client/program-client.h +++ b/src/lib-program-client/program-client.h @@ -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 diff --git a/src/lib-program-client/test-program-client-net.c b/src/lib-program-client/test-program-client-net.c index 9aa424680b..ed7d68db79 100644 --- a/src/lib-program-client/test-program-client-net.c +++ b/src/lib-program-client/test-program-client-net.c @@ -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(); } diff --git a/src/lib-program-client/test-program-client-unix.c b/src/lib-program-client/test-program-client-unix.c index 2965813971..e524c887e3 100644 --- a/src/lib-program-client/test-program-client-unix.c +++ b/src/lib-program-client/test-program-client-unix.c @@ -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); } diff --git a/src/lib-smtp/smtp-submit.c b/src/lib-smtp/smtp-submit.c index 9e7c13f9cc..0328b95488 100644 --- a/src/lib-smtp/smtp-submit.c +++ b/src/lib-smtp/smtp-submit.c @@ -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;