1 /* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
2  */
3 
4 #include "lib.h"
5 #include "str.h"
6 #include "strfuncs.h"
7 #include "istream.h"
8 
9 #include "sieve-common.h"
10 #include "sieve-error.h"
11 #include "sieve-dump.h"
12 #include "sieve-binary.h"
13 
14 #include "sieve-data-storage.h"
15 
16 /*
17  * Script data implementation
18  */
19 
sieve_data_script_alloc(void)20 static struct sieve_data_script *sieve_data_script_alloc(void)
21 {
22 	struct sieve_data_script *dscript;
23 	pool_t pool;
24 
25 	pool = pool_alloconly_create("sieve_data_script", 1024);
26 	dscript = p_new(pool, struct sieve_data_script, 1);
27 	dscript->script = sieve_data_script;
28 	dscript->script.pool = pool;
29 
30 	return dscript;
31 }
32 
sieve_data_script_create_from_input(struct sieve_instance * svinst,const char * name,struct istream * input)33 struct sieve_script *sieve_data_script_create_from_input
34 (struct sieve_instance *svinst, const char *name, struct istream *input)
35 {
36 	struct sieve_storage *storage;
37 	struct sieve_data_script *dscript = NULL;
38 
39 	storage = sieve_storage_alloc(svinst, NULL, &sieve_data_storage,
40 				      "", 0, FALSE);
41 
42 	dscript = sieve_data_script_alloc();
43 	sieve_script_init(&dscript->script,
44 		storage, &sieve_data_script, "data:", name);
45 
46 	dscript->data = input;
47 	i_stream_ref(dscript->data);
48 
49 	sieve_storage_unref(&storage);
50 
51 	dscript->script.open = TRUE;
52 
53 	return &dscript->script;
54 }
55 
sieve_data_script_destroy(struct sieve_script * script)56 static void sieve_data_script_destroy(struct sieve_script *script)
57 {
58 	struct sieve_data_script *dscript =
59 		(struct sieve_data_script *)script;
60 
61 	i_stream_unref(&dscript->data);
62 }
63 
sieve_data_script_get_stream(struct sieve_script * script,struct istream ** stream_r,enum sieve_error * error_r)64 static int sieve_data_script_get_stream
65 (struct sieve_script *script, struct istream **stream_r,
66 	enum sieve_error *error_r)
67 {
68 	struct sieve_data_script *dscript =
69 		(struct sieve_data_script *)script;
70 
71 	i_stream_ref(dscript->data);
72 	i_stream_seek(dscript->data, 0);
73 
74 	*stream_r = dscript->data;
75 	*error_r = SIEVE_ERROR_NONE;
76 	return 0;
77 }
78 
sieve_data_script_equals(const struct sieve_script * script ATTR_UNUSED,const struct sieve_script * other ATTR_UNUSED)79 static bool sieve_data_script_equals
80 (const struct sieve_script *script ATTR_UNUSED,
81 	const struct sieve_script *other ATTR_UNUSED)
82 {
83 	return ( script == other );
84 }
85 
86 const struct sieve_script sieve_data_script = {
87 	.driver_name = SIEVE_DATA_STORAGE_DRIVER_NAME,
88 	.v = {
89 		.destroy = sieve_data_script_destroy,
90 
91 		.get_stream = sieve_data_script_get_stream,
92 
93 		.equals = sieve_data_script_equals
94 	}
95 };
96