bool cmd_getscript(struct client_command_context *cmd) { struct client *client = cmd->client; struct cmd_getscript_context *ctx; const char *scriptname; enum sieve_error error; /* <scriptname> */ if ( !client_read_string_args(cmd, TRUE, 1, &scriptname) ) return FALSE; ctx = p_new(cmd->pool, struct cmd_getscript_context, 1); ctx->cmd = cmd; ctx->client = client; ctx->storage = client->storage; ctx->failed = FALSE; ctx->script = sieve_storage_open_script (client->storage, scriptname, NULL); if (ctx->script == NULL) { ctx->failed = TRUE; return cmd_getscript_finish(ctx); } if ( sieve_script_get_stream (ctx->script, &ctx->script_stream, &error) < 0 ) { if ( error == SIEVE_ERROR_NOT_FOUND ) sieve_storage_set_error(client->storage, error, "Script does not exist."); ctx->failed = TRUE; return cmd_getscript_finish(ctx); } if ( sieve_script_get_size(ctx->script, &ctx->script_size) <= 0 ) { sieve_storage_set_critical(ctx->storage, "failed to obtain script size for script `%s' from %s", sieve_script_name(ctx->script), sieve_script_location(ctx->script)); ctx->failed = TRUE; return cmd_getscript_finish(ctx); } i_assert(ctx->script_stream->v_offset == 0); client_send_line (client, t_strdup_printf("{%"PRIuUOFF_T"}", ctx->script_size)); client->command_pending = TRUE; cmd->func = cmd_getscript_continue; cmd->context = ctx; return cmd_getscript_continue(cmd); }
static int sieve_attribute_retrieve_script(struct mail_storage *storage, struct sieve_storage *svstorage, struct sieve_script *script, bool add_type_prefix, struct mail_attribute_value *value_r, const char **errorstr_r) { static char type = MAILBOX_ATTRIBUTE_SIEVE_DEFAULT_SCRIPT; struct istream *input, *inputs[3]; const struct stat *st; enum sieve_error error; if (script == NULL) *errorstr_r = sieve_storage_get_last_error(svstorage, &error); else if (sieve_script_get_stream(script, &input, &error) < 0) sieve_script_unref(&script); if (script == NULL) { if (error == SIEVE_ERROR_NOT_FOUND) { /* already deleted, but return the last_change */ (void)sieve_storage_get_last_change(svstorage, &value_r->last_change); return 0; } *errorstr_r = sieve_storage_get_last_error(svstorage, &error); return -1; } if (i_stream_stat(input, FALSE, &st) < 0) { mail_storage_set_critical(storage, "stat(%s) failed: %m", i_stream_get_name(input)); } else { value_r->last_change = st->st_mtime; } if (!add_type_prefix) { i_stream_ref(input); value_r->value_stream = input; } else { inputs[0] = i_stream_create_from_data(&type, 1); inputs[1] = input; inputs[2] = NULL; value_r->value_stream = i_stream_create_concat(inputs); i_stream_unref(&inputs[0]); } sieve_script_unref(&script); return 1; }
static int cmd_sieve_get_run(struct doveadm_sieve_cmd_context *_ctx) { struct doveadm_sieve_get_cmd_context *ctx = (struct doveadm_sieve_get_cmd_context *)_ctx; struct sieve_script *script; struct istream *input; enum sieve_error error; script = sieve_storage_open_script (_ctx->storage, ctx->scriptname, &error); if ( script == NULL || sieve_script_get_stream (script, &input, &error) < 0 ) { i_error("Failed to open Sieve script: %s", sieve_storage_get_last_error(_ctx->storage, &error)); doveadm_sieve_cmd_failed_error(_ctx, error); if (script != NULL) sieve_script_unref(&script); return -1; } return doveadm_print_istream(input); }