57
57
ARRAY_DEFINE(include_index, struct ext_include_script_info *);
59
59
struct sieve_variable_scope_binary *global_vars;
61
unsigned int outdated:1;
63
64
static struct ext_include_binary_context *ext_include_binary_create_context
64
65
(const struct sieve_extension *this_ext, struct sieve_binary *sbin)
224
225
sieve_binary_emit_unsigned(sblock, sieve_binary_block_get_id(incscript->block));
225
226
sieve_binary_emit_byte(sblock, incscript->location);
226
227
sieve_binary_emit_cstring(sblock, sieve_script_name(incscript->script));
228
sieve_script_binary_write_metadata(incscript->script, sblock);
229
231
result = ext_include_variables_save(sblock, binctx->global_vars);
270
272
struct sieve_binary_block *inc_block;
271
273
unsigned int location;
272
274
string_t *script_name;
273
const char *script_dir;
275
const char *script_location;
274
276
struct sieve_script *script;
277
280
!sieve_binary_read_unsigned(sblock, &offset, &inc_block_id) ||
298
301
/* Binary is corrupt, recompile */
299
302
sieve_sys_error(svinst,
300
303
"include: dependency block %d of binary %s "
301
"reports invalid script location (id %d)",
304
"uses invalid script location (id %d)",
302
305
block_id, sieve_binary_path(sbin), location);
306
309
/* Can we find/open the script dependency ? */
307
script_dir = ext_include_get_script_directory
310
script_location = ext_include_get_script_location
308
311
(ext, location, str_c(script_name));
309
if ( script_dir == NULL ||
310
!(script=sieve_script_create_in_directory
311
(ext->svinst, script_dir, str_c(script_name), NULL, NULL)) ) {
312
if ( script_location == NULL || (script=sieve_script_create
313
(ext->svinst, script_location, str_c(script_name), NULL, NULL)) == NULL )
312
315
/* No, recompile */
319
if ( (ret=sieve_script_binary_read_metadata(script, sblock, &offset))
321
/* Binary is corrupt, recompile */
322
sieve_sys_error(svinst,
323
"include: dependency block %d of binary %s "
324
"contains invalid script metadata for script %s",
325
block_id, sieve_binary_path(sbin), sieve_script_location(script));
330
binctx->outdated = TRUE;
316
332
(void)ext_include_binary_script_include
317
333
(binctx, script, location, inc_block);
329
345
static bool ext_include_binary_up_to_date
330
(const struct sieve_extension *ext ATTR_UNUSED, struct sieve_binary *sbin,
331
void *context, enum sieve_compile_flags cpflags ATTR_UNUSED)
346
(const struct sieve_extension *ext ATTR_UNUSED,
347
struct sieve_binary *sbin ATTR_UNUSED, void *context,
348
enum sieve_compile_flags cpflags ATTR_UNUSED)
333
350
struct ext_include_binary_context *binctx =
334
351
(struct ext_include_binary_context *) context;
335
struct hash_iterate_context *hctx;
338
/* Check all included scripts for changes */
339
hctx = hash_table_iterate_init(binctx->included_scripts);
340
while ( hash_table_iterate(hctx, &key, &value) ) {
341
struct ext_include_script_info *incscript =
342
(struct ext_include_script_info *) value;
344
/* Is the binary old than this dependency? */
345
if ( sieve_binary_script_newer(sbin, incscript->script) ) {
350
hash_table_iterate_deinit(&hctx);
353
return !binctx->outdated;
355
356
static void ext_include_binary_free