BadVPN – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 /**
2 * @file var.c
3 * @author Ambroz Bizjak <ambrop7@gmail.com>
4 *
5 * @section LICENSE
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of the author nor the
15 * names of its contributors may be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * @section DESCRIPTION
30 *
31 * Variable module.
32 *
33 * Synopsis: var(value)
34 * Variables:
35 * (empty) - value
36 *
37 * Synopsis: var::set(value)
38 */
39  
40 #include <stdlib.h>
41 #include <string.h>
42  
43 #include <ncd/module_common.h>
44  
45 #include <generated/blog_channel_ncd_var.h>
46  
47 struct instance {
48 NCDModuleInst *i;
49 NCDValMem mem;
50 NCDValRef value;
51 };
52  
53 static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new_params *params)
54 {
55 struct instance *o = vo;
56 o->i = i;
57  
58 // read argument
59 NCDValRef value_arg;
60 if (!NCDVal_ListRead(params->args, 1, &value_arg)) {
61 ModuleLog(o->i, BLOG_ERROR, "wrong arity");
62 goto fail0;
63 }
64  
65 // init mem
66 NCDValMem_Init(&o->mem, i->params->iparams->string_index);
67  
68 // copy value
69 o->value = NCDVal_NewCopy(&o->mem, value_arg);
70 if (NCDVal_IsInvalid(o->value)) {
71 goto fail1;
72 }
73  
74 // signal up
75 NCDModuleInst_Backend_Up(o->i);
76 return;
77  
78 fail1:
79 NCDValMem_Free(&o->mem);
80 fail0:
81 NCDModuleInst_Backend_DeadError(i);
82 }
83  
84 static void func_die (void *vo)
85 {
86 struct instance *o = vo;
87  
88 // free mem
89 NCDValMem_Free(&o->mem);
90  
91 NCDModuleInst_Backend_Dead(o->i);
92 }
93  
94 static int func_getvar2 (void *vo, NCD_string_id_t name, NCDValMem *mem, NCDValRef *out)
95 {
96 struct instance *o = vo;
97  
98 if (name == NCD_STRING_EMPTY) {
99 *out = NCDVal_NewCopy(mem, o->value);
100 return 1;
101 }
102  
103 return 0;
104 }
105  
106 static void set_func_new (void *unused, NCDModuleInst *i, const struct NCDModuleInst_new_params *params)
107 {
108 // read arguments
109 NCDValRef value_arg;
110 if (!NCDVal_ListRead(params->args, 1, &value_arg)) {
111 ModuleLog(i, BLOG_ERROR, "wrong arity");
112 goto fail0;
113 }
114  
115 // get method object
116 struct instance *mo = NCDModuleInst_Backend_GetUser((NCDModuleInst *)params->method_user);
117  
118 // allocate new mem
119 NCDValMem mem;
120 NCDValMem_Init(&mem, i->params->iparams->string_index);
121  
122 // copy value
123 NCDValRef copy = NCDVal_NewCopy(&mem, value_arg);
124 if (NCDVal_IsInvalid(copy)) {
125 goto fail1;
126 }
127  
128 // replace value in var
129 NCDValMem_Free(&mo->mem);
130 mo->mem = mem;
131 mo->value = NCDVal_Moved(&mo->mem, copy);
132  
133 // signal up
134 NCDModuleInst_Backend_Up(i);
135 return;
136  
137 fail1:
138 NCDValMem_Free(&mem);
139 fail0:
140 NCDModuleInst_Backend_DeadError(i);
141 }
142  
143 static struct NCDModule modules[] = {
144 {
145 .type = "var",
146 .func_new2 = func_new,
147 .func_die = func_die,
148 .func_getvar2 = func_getvar2,
149 .alloc_size = sizeof(struct instance)
150 }, {
151 .type = "var::set",
152 .func_new2 = set_func_new
153 }, {
154 .type = NULL
155 }
156 };
157  
158 const struct NCDModuleGroup ncdmodule_var = {
159 .modules = modules
160 };