struct sieve_generator *sieve_generator_create (struct sieve_ast *ast, struct sieve_error_handler *ehandler, enum sieve_compile_flags flags) { pool_t pool; struct sieve_generator *gentr; struct sieve_script *script; struct sieve_instance *svinst; pool = pool_alloconly_create("sieve_generator", 4096); gentr = p_new(pool, struct sieve_generator, 1); gentr->pool = pool; gentr->ehandler = ehandler; sieve_error_handler_ref(ehandler); gentr->genenv.gentr = gentr; gentr->genenv.flags = flags; gentr->genenv.ast = ast; sieve_ast_ref(ast); script = sieve_ast_script(ast); svinst = sieve_script_svinst(script); gentr->genenv.script = script; gentr->genenv.svinst = svinst; /* Setup storage for extension contexts */ p_array_init(&gentr->ext_contexts, pool, sieve_extensions_get_count(svinst)); return gentr; }
struct sieve_binary *sieve_open_script (struct sieve_script *script, struct sieve_error_handler *ehandler, enum sieve_compile_flags flags, enum sieve_error *error_r) { struct sieve_instance *svinst = sieve_script_svinst(script); struct sieve_binary *sbin; T_BEGIN { /* Then try to open the matching binary */ sbin = sieve_script_binary_load(script, error_r); if (sbin != NULL) { /* Ok, it exists; now let's see if it is up to date */ if ( !sieve_binary_up_to_date(sbin, flags) ) { /* Not up to date */ if ( svinst->debug ) { sieve_sys_debug(svinst, "Script binary %s is not up-to-date", sieve_binary_path(sbin)); } sieve_binary_unref(&sbin); sbin = NULL; } } /* If the binary does not exist or is not up-to-date, we need * to (re-)compile. */ if ( sbin != NULL ) { if ( svinst->debug ) { sieve_sys_debug(svinst, "Script binary %s successfully loaded", sieve_binary_path(sbin)); } } else { sbin = sieve_compile_script(script, ehandler, flags, error_r); if ( sbin != NULL ) { if ( svinst->debug ) { sieve_sys_debug(svinst, "Script `%s' from %s successfully compiled", sieve_script_name(script), sieve_script_location(script)); } } } } T_END; return sbin; }
struct sieve_binary *sieve_binary_open (struct sieve_instance *svinst, const char *path, struct sieve_script *script, enum sieve_error *error_r) { struct sieve_binary_extension_reg *const *regs; unsigned int ext_count, i; struct sieve_binary *sbin; struct sieve_binary_file *file; i_assert( script == NULL || sieve_script_svinst(script) == svinst ); //file = _file_memory_open(path); if ( (file=_file_lazy_open(svinst, path, error_r)) == NULL ) return NULL; /* Create binary object */ sbin = sieve_binary_create(svinst, script); sbin->path = p_strdup(sbin->pool, path); sbin->file = file; if ( !_sieve_binary_open(sbin) ) { sieve_binary_unref(&sbin); if ( error_r != NULL ) *error_r = SIEVE_ERROR_NOT_VALID; return NULL; } sieve_binary_activate(sbin); /* Signal open event to extensions */ regs = array_get(&sbin->extensions, &ext_count); for ( i = 0; i < ext_count; i++ ) { const struct sieve_binary_extension *binext = regs[i]->binext; if ( binext != NULL && binext->binary_open != NULL && !binext->binary_open(regs[i]->extension, sbin, regs[i]->context) ) { /* Extension thinks its corrupt */ if ( error_r != NULL ) *error_r = SIEVE_ERROR_NOT_VALID; sieve_binary_unref(&sbin); return NULL; } } return sbin; }