4 * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: YoungHun Kim <yh8004.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 #include "muse_server_private.h"
24 void muse_server_set_dispatch_timeout(muse_module_h m, int api, int timeout)
26 muse_return_if_fail(m);
27 muse_return_if_fail(m->idx >= 0 && m->idx < ms_config_get_host_cnt());
28 muse_return_if_fail(api >= 0 && api < MUSE_DISPATCHER_MAX);
30 ms_module_set_timeout(m->idx, api, timeout);
33 int muse_server_get_dispatch_timeout(muse_module_h m, int api)
35 muse_return_val_if_fail(m, MM_ERROR_INVALID_ARGUMENT);
36 muse_return_val_if_fail(m->pid > 0, MM_ERROR_INVALID_ARGUMENT);
37 muse_return_val_if_fail(m->idx >= 0 && m->idx < ms_config_get_host_cnt(), MM_ERROR_INVALID_ARGUMENT);
38 muse_return_val_if_fail(api >= 0 && api < MUSE_DISPATCHER_MAX, MM_ERROR_INVALID_ARGUMENT);
40 return ms_module_get_timeout(m->idx, api);
44 int muse_server_module_set_value(muse_module_h m, const char *name, int value)
46 muse_return_val_if_fail(m, MM_ERROR_INVALID_ARGUMENT);
47 muse_return_val_if_fail(m->pid > 0, MM_ERROR_INVALID_ARGUMENT);
48 muse_return_val_if_fail(name, MM_ERROR_INVALID_ARGUMENT);
49 muse_return_val_if_fail(m->idx >= 0 && m->idx < ms_config_get_host_cnt(), MM_ERROR_INVALID_ARGUMENT);
51 ms_module_set_dllsym_value(m->idx, name, GINT_TO_POINTER(value));
55 int muse_server_module_get_value(muse_module_h m, const char *name, int *value)
57 int ret = MM_ERROR_NONE;
60 muse_return_val_if_fail(m, MM_ERROR_INVALID_ARGUMENT);
61 muse_return_val_if_fail(m->pid > 0, MM_ERROR_INVALID_ARGUMENT);
62 muse_return_val_if_fail(name, MM_ERROR_INVALID_ARGUMENT);
63 muse_return_val_if_fail(value, MM_ERROR_INVALID_ARGUMENT);
64 muse_return_val_if_fail(m->idx >= 0 && m->idx < ms_config_get_host_cnt(), MM_ERROR_INVALID_ARGUMENT);
66 ret = ms_module_get_dllsym_value(m->idx, name, &ptr);
67 if (ret == MM_ERROR_NONE)
68 *value = GPOINTER_TO_INT(ptr);
72 int muse_server_module_get_msg_fd(muse_module_h m)
74 muse_return_val_if_fail(m, MM_ERROR_INVALID_ARGUMENT);
75 muse_return_val_if_fail(m->pid > 0, MM_ERROR_INVALID_ARGUMENT);
76 return m->ch[MUSE_CHANNEL_MSG].sock_fd;
79 int muse_server_module_get_data_fd(muse_module_h m)
81 muse_return_val_if_fail(m, MM_ERROR_INVALID_ARGUMENT);
82 muse_return_val_if_fail(m->pid > 0, MM_ERROR_INVALID_ARGUMENT);
83 return m->ch[MUSE_CHANNEL_DATA].sock_fd;
86 char *muse_server_module_get_msg(muse_module_h m)
88 muse_return_val_if_fail(m, NULL);
89 return (m->recv_msg + m->msg_offset);
92 void muse_server_set_user_data(muse_module_h m, void *data)
94 muse_return_if_fail(m);
98 void *muse_server_get_user_data(muse_module_h m)
100 muse_return_val_if_fail(m, NULL);
104 bool muse_server_module_is_valid(muse_module_h m)
106 muse_return_val_if_fail(m, false);
107 muse_return_val_if_fail(m->pid > 0, false);
108 muse_return_val_if_fail(muse_core_fd_is_valid(m->ch[MUSE_CHANNEL_MSG].sock_fd), false);
114 int muse_server_ipc_get_bufmgr(tbm_bufmgr *bufmgr)
118 muse_return_val_if_fail(ms_get_instance(), MM_ERROR_UNKNOWN);
119 muse_return_val_if_fail(bufmgr, MM_ERROR_INVALID_ARGUMENT);
121 if (!ms_get_instance()->bufmgr)
122 muse_return_val_if_fail(ms_init_bufmgr(), MM_ERROR_INVALID_ARGUMENT);
124 LOGD("bufmgr: %p", ms_get_instance()->bufmgr);
125 *bufmgr = ms_get_instance()->bufmgr;
128 return MM_ERROR_NONE;
131 int muse_server_ipc_get_gdbus_connection(GDBusConnection **gdbus)
135 muse_return_val_if_fail(gdbus, MM_ERROR_INVALID_ARGUMENT);
136 if (!ms_system_get_gdbus(gdbus))
137 return MM_ERROR_UNKNOWN;
139 LOGD("gdbus : %p", *gdbus);
140 return MM_ERROR_NONE;
143 char *muse_server_ipc_get_data(muse_module_h m)
145 muse_channel_info_t *ch = NULL;
146 char *raw_data = NULL;
148 gint64 end_time = g_get_monotonic_time() + 100 * G_TIME_SPAN_MILLISECOND;
149 muse_return_val_if_fail(m, NULL);
151 ch = &m->ch[MUSE_CHANNEL_DATA];
152 muse_return_val_if_fail(ch->data_queue, NULL);
154 g_mutex_lock(&ch->data_mutex);
155 while (!(raw_data = (char *)g_queue_pop_head(ch->data_queue))) {
156 if (!g_cond_wait_until(&ch->data_cond, &ch->data_mutex, end_time)) {
157 LOGE("[%d] timeout has passed", ch->sock_fd);
161 g_mutex_unlock(&ch->data_mutex);
164 LOGE("NULL raw_data");
168 return (raw_data + sizeof(muse_recv_data_head_t));
171 void muse_server_ipc_delete_data(char *data)
173 char *raw_data = NULL;
175 muse_return_if_fail(data);
177 raw_data = data - sizeof(muse_recv_data_head_t);
182 bool muse_server_ipc_get_data_info(char *data, uint64_t *data_id, int *size)
184 muse_recv_data_t *qdata = NULL;
186 muse_return_val_if_fail(data, false);
188 qdata = (muse_recv_data_t *)(data - sizeof(muse_recv_data_head_t));
189 if (qdata && qdata->header.marker == MUSE_DATA_HEAD) {
191 *data_id = qdata->header.id;
193 *size = qdata->header.size;
201 intptr_t muse_server_ipc_get_handle(muse_module_h m)
203 muse_return_val_if_fail(m, 0);
204 muse_return_val_if_fail(m->handle, 0);
209 int muse_server_ipc_set_handle(muse_module_h m, intptr_t handle)
211 muse_return_val_if_fail(m, MM_ERROR_INVALID_ARGUMENT);
214 return MM_ERROR_NONE;
217 int muse_server_ipc_get_fd(muse_module_h m, int *fd)
219 muse_return_val_if_fail(m, MM_ERROR_INVALID_ARGUMENT);
220 muse_return_val_if_fail(m->pid > 0, MM_ERROR_INVALID_ARGUMENT);
221 muse_return_val_if_fail(fd, MM_ERROR_INVALID_ARGUMENT);
223 *fd = m->ch[MUSE_CHANNEL_MSG].tbm_fd[0];
224 return MM_ERROR_NONE;
227 int muse_server_ipc_get_fds(muse_module_h m, int *fds, int *number)
231 muse_return_val_if_fail(m, MM_ERROR_INVALID_ARGUMENT);
232 muse_return_val_if_fail(m->pid > 0, MM_ERROR_INVALID_ARGUMENT);
233 muse_return_val_if_fail(fds, MM_ERROR_INVALID_ARGUMENT);
234 muse_return_val_if_fail(number, MM_ERROR_INVALID_ARGUMENT);
236 for (i = 0 ; i < MUSE_NUM_FD ; i++) {
237 if (m->ch[MUSE_CHANNEL_MSG].tbm_fd[i] < 0)
240 fds[i] = m->ch[MUSE_CHANNEL_MSG].tbm_fd[i];
245 return MM_ERROR_NONE;
248 int muse_server_ipc_set_fd(muse_module_h m, int fd)
250 muse_return_val_if_fail(m, MM_ERROR_INVALID_ARGUMENT);
251 muse_return_val_if_fail(m->pid > 0, MM_ERROR_INVALID_ARGUMENT);
253 if (!muse_core_fd_is_valid(fd)) {
254 LOGE("invalid fd: %d", fd);
255 return MM_ERROR_INVALID_ARGUMENT;
258 m->ch[MUSE_CHANNEL_MSG].tbm_fd[0] = fd;
259 return MM_ERROR_NONE;
262 int muse_server_ipc_get_client_pid(muse_module_h m)
264 muse_return_val_if_fail(m, MUSE_ERR);
269 bool muse_server_security_check_cynara(int fd, const char *privilege)
271 muse_return_val_if_fail(ms_get_instance(), false);
272 muse_return_val_if_fail(ms_get_instance()->security, false);
274 return ms_security_is_privilege_granted(ms_get_instance()->security, fd, privilege);
277 unsigned int muse_server_get_atomic_uint(void)
279 static guint atom = 0;
281 g_atomic_int_inc(&atom);
286 int muse_server_get_platform_info(const char *key, bool *value)
288 return ms_system_get_platform_info(key, value);
291 int muse_server_get_module_instance_count(int idx)
293 ms_connection_t *connection = NULL;
295 muse_return_val_if_fail(ms_get_instance(), MUSE_ERR);
297 connection = ms_get_instance()->connection;
298 muse_return_val_if_fail(connection, MUSE_ERR);
300 return connection->instance_count[idx];
303 bool muse_server_is_on_demand(void)
305 ms_config_t *conf = NULL;
307 muse_return_val_if_fail(ms_get_instance(), FALSE);
309 conf = ms_get_instance()->conf;
310 muse_return_val_if_fail(conf, FALSE);
312 return conf->is_on_demand;
315 int main(int argc, char **argv)
318 #ifdef MUSE_TTRACE_LOG
319 trace_begin("MUSE:START");