libamxd  6.4.1
Data Model Manager
amxd_common.c
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** SPDX-License-Identifier: BSD-2-Clause-Patent
4 **
5 ** SPDX-FileCopyrightText: Copyright (c) 2023 SoftAtHome
6 **
7 ** Redistribution and use in source and binary forms, with or without modification,
8 ** are permitted provided that the following conditions are met:
9 **
10 ** 1. Redistributions of source code must retain the above copyright notice,
11 ** this list of conditions and the following disclaimer.
12 **
13 ** 2. Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 **
17 ** Subject to the terms and conditions of this license, each copyright holder
18 ** and contributor hereby grants to those receiving rights under this license
19 ** a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
20 ** (except for failure to satisfy the conditions of this license) patent license
21 ** to make, have made, use, offer to sell, sell, import, and otherwise transfer
22 ** this software, where such license applies only to those patent claims, already
23 ** acquired or hereafter acquired, licensable by such copyright holder or contributor
24 ** that are necessarily infringed by:
25 **
26 ** (a) their Contribution(s) (the licensed copyrights of copyright holders and
27 ** non-copyrightable additions of contributors, in source or binary form) alone;
28 ** or
29 **
30 ** (b) combination of their Contribution(s) with the work of authorship to which
31 ** such Contribution(s) was added by such copyright holder or contributor, if,
32 ** at the time the Contribution is added, such addition causes such combination
33 ** to be necessarily infringed. The patent license shall not apply to any other
34 ** combinations which include the Contribution.
35 **
36 ** Except as expressly stated above, no rights or licenses from any copyright
37 ** holder or contributor is granted under this license, whether expressly, by
38 ** implication, estoppel or otherwise.
39 **
40 ** DISCLAIMER
41 **
42 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
43 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
46 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
48 ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
49 ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50 ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
51 ** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52 **
53 ****************************************************************************/
54 
55 #include <ctype.h>
56 
57 #include <amxc/amxc.h>
58 #include <amxp/amxp_signal.h>
59 
60 #include <amxd/amxd_common.h>
61 #include <amxd/amxd_types.h>
62 
63 #include "amxd_priv.h"
64 #include "amxd_assert.h"
65 #include "amxd_object_priv.h"
66 
67 static const char* amxd_error_str[] = {
68  "ok",
69  "unknown error",
70  "object not found",
71  "function not found",
72  "parameter not found",
73  "function not implemented",
74  "invalid function",
75  "invalid function argument",
76  "invalid name",
77  "invalid attribute",
78  "invalid value",
79  "invalid action",
80  "invalid type",
81  "duplicate",
82  "operation deferred",
83  "is read only",
84  "missing key value",
85  "file not found",
86  "invalid argument",
87  "out of memory",
88  "invalid recursion detected",
89  "invalid path",
90  "invalid expression",
91  "permission denied",
92  "not supported",
93  "not in instantiated data model",
94  "not a template object",
95  "timeout",
96  "last",
97 };
98 
99 amxd_dm_cb_t* amxd_get_action(const amxc_llist_t* const cb_fns,
100  const amxd_action_t reason,
101  amxd_action_fn_t fn) {
102  amxd_dm_cb_t* cb = NULL;
103  amxc_llist_for_each(it, cb_fns) {
104  cb = amxc_llist_it_get_data(it, amxd_dm_cb_t, it);
105  if((cb->reason == reason) &&
106  ((fn == NULL) || (cb->fn == fn))) {
107  break;
108  }
109  cb = NULL;
110  }
111 
112  return cb;
113 }
114 
115 bool amxd_name_is_valid(const char* name) {
116  bool retval = false;
117  when_str_empty(name, exit);
118  when_true(isalpha(name[0]) == 0 && name[0] != '_', exit);
119 
120  for(int i = 0; name[i] != 0; i++) {
121  if(isalnum(name[i]) == 0) {
122  if((name[i] != '_') && (name[i] != '-')) {
123  goto exit;
124  }
125  }
126  }
127 
128  retval = true;
129 
130 exit:
131  return retval;
132 }
133 
135  if((status >= 0) && (status <= amxd_status_last)) {
136  return amxd_error_str[status];
137  }
138 
139  return amxd_error_str[1];
140 }
141 
143  amxc_var_t* const retval,
144  const char* description,
145  void* priv) {
147  amxc_var_t* var_description = NULL;
148  amxc_var_t* data = (amxc_var_t*) priv;
149 
150  when_true(reason != action_describe_action, exit);
151  when_false(amxc_var_type_of(retval) == AMXC_VAR_ID_HTABLE, exit);
152 
153  var_description = amxc_var_add_new_key(retval, description);
154  amxc_var_copy(var_description, data);
156 
157 exit:
158  return status;
159 }
amxd_dm_cb_t * amxd_get_action(const amxc_llist_t *const cb_fns, const amxd_action_t reason, amxd_action_fn_t fn)
Definition: amxd_common.c:99
bool amxd_name_is_valid(const char *name)
Definition: amxd_common.c:115
amxd_status_t amxd_action_describe_action(amxd_action_t reason, amxc_var_t *const retval, const char *description, void *priv)
Definition: amxd_common.c:142
const char * amxd_status_string(const amxd_status_t status)
Definition: amxd_common.c:134
static const char * amxd_error_str[]
Definition: amxd_common.c:67
@ action_describe_action
Definition: amxd_types.h:127
amxd_status_t(* amxd_action_fn_t)(amxd_object_t *const object, amxd_param_t *const param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Definition: amxd_types.h:150
enum _amxd_action amxd_action_t
enum _amxd_status amxd_status_t
@ amxd_status_function_not_implemented
Definition: amxd_types.h:83
@ amxd_status_last
Definition: amxd_types.h:106
@ amxd_status_ok
Definition: amxd_types.h:78
amxd_action_t reason
Definition: amxd_types.h:160
amxd_action_fn_t fn
Definition: amxd_types.h:159
static amxd_status_t status