diff options
69 files changed, 1096 insertions, 66 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 507375c..660cb1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,6 +77,10 @@ ADD_EXECUTABLE(${PROJECT_NAME} src/liveinfo.c src/pkgmgr.c src/event.c + src/shortcut_service.c + src/badge_service.c + src/notification_service.c + src/service_common.c ) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkg_LDFLAGS} "-ldl") diff --git a/data/data-provider-master b/data/data-provider-master index f2125bb..a68b7d5 100755 --- a/data/data-provider-master +++ b/data/data-provider-master @@ -6,7 +6,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://floralicense.org +# http://floralicense.org/license/ # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, diff --git a/data/data-provider-master.service b/data/data-provider-master.service index 6333352..f412797 100644 --- a/data/data-provider-master.service +++ b/data/data-provider-master.service @@ -5,7 +5,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://floralicense.org +# http://floralicense.org/license/ # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/abi.h b/include/abi.h index 974999d..d1900b3 100644 --- a/include/abi.h +++ b/include/abi.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/badge_service.h b/include/badge_service.h new file mode 100644 index 0000000..94fb941 --- /dev/null +++ b/include/badge_service.h @@ -0,0 +1,16 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + diff --git a/include/buffer_handler.h b/include/buffer_handler.h index 8a5aea0..21d6707 100644 --- a/include/buffer_handler.h +++ b/include/buffer_handler.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/client_life.h b/include/client_life.h index 8b76f1a..4871974 100644 --- a/include/client_life.h +++ b/include/client_life.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/client_rpc.h b/include/client_rpc.h index 2cf0242..ccfa129 100644 --- a/include/client_rpc.h +++ b/include/client_rpc.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/conf.h b/include/conf.h index cd410ab..87d1070 100644 --- a/include/conf.h +++ b/include/conf.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/critical_log.h b/include/critical_log.h index cd0f769..757ae63 100644 --- a/include/critical_log.h +++ b/include/critical_log.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/dead_monitor.h b/include/dead_monitor.h index 1526f89..118c5ac 100644 --- a/include/dead_monitor.h +++ b/include/dead_monitor.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/debug.h b/include/debug.h index 317129f..5058acc 100644 --- a/include/debug.h +++ b/include/debug.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/event.h b/include/event.h index fe0d219..4cf46e4 100644 --- a/include/event.h +++ b/include/event.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/fault_manager.h b/include/fault_manager.h index e2bb96c..d61e225 100644 --- a/include/fault_manager.h +++ b/include/fault_manager.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/fb.h b/include/fb.h index baf5b4c..066f97a 100644 --- a/include/fb.h +++ b/include/fb.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/group.h b/include/group.h index 08de02b..161e0a4 100644 --- a/include/group.h +++ b/include/group.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/instance.h b/include/instance.h index 83f5c88..535defa 100644 --- a/include/instance.h +++ b/include/instance.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/io.h b/include/io.h index a857422..6624db5 100644 --- a/include/io.h +++ b/include/io.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/liveinfo.h b/include/liveinfo.h index 2dd1afd..e86e4a2 100644 --- a/include/liveinfo.h +++ b/include/liveinfo.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/main.h b/include/main.h index 92efdbb..94fb941 100644 --- a/include/main.h +++ b/include/main.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/notification_service.h b/include/notification_service.h new file mode 100644 index 0000000..94fb941 --- /dev/null +++ b/include/notification_service.h @@ -0,0 +1,16 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + diff --git a/include/package.h b/include/package.h index 3278c32..9735fa2 100644 --- a/include/package.h +++ b/include/package.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/parser.h b/include/parser.h index 82c96ef..db828b9 100644 --- a/include/parser.h +++ b/include/parser.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/pkgmgr.h b/include/pkgmgr.h index 2cb4008..e942697 100644 --- a/include/pkgmgr.h +++ b/include/pkgmgr.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/rpc_to_slave.h b/include/rpc_to_slave.h index 725a679..cfc87b9 100644 --- a/include/rpc_to_slave.h +++ b/include/rpc_to_slave.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/script_handler.h b/include/script_handler.h index 02c6a4f..c676836 100644 --- a/include/script_handler.h +++ b/include/script_handler.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/server.h b/include/server.h index ac93e32..570eb87 100644 --- a/include/server.h +++ b/include/server.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/service_common.h b/include/service_common.h new file mode 100644 index 0000000..6b0e4dd --- /dev/null +++ b/include/service_common.h @@ -0,0 +1,37 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +enum tcb_type { + TCB_CLIENT_TYPE_UNDEFINED = 0x00, + TCB_CLIENT_TYPE_APP = 0x01, + TCB_CLIENT_TYPE_SERVICE = 0x02, + TCB_CLIENT_TYPE_UNKNOWN = 0xff, +}; + +struct tcb; +struct service_context; + +extern int tcb_fd(struct tcb *tcb); +extern struct service_context *tcb_svc_ctx(struct tcb *tcb); +extern int tcb_client_type(struct tcb *tcb); +extern int tcb_client_type_set(struct tcb *tcb, enum tcb_type type); + +extern struct service_context *service_common_create(const char *addr, int (*service_thread_main)(struct tcb *tcb, struct packet *packet, void *data), void *data); +extern int service_common_destroy(struct service_context *svc_ctx); + +extern int service_common_multicast_packet(struct tcb *tcb, struct packet *packet, int type); +extern int service_common_unicast_packet(struct tcb *tcb, struct packet *packet); + +/* End of a file */ diff --git a/include/setting.h b/include/setting.h index 5ec158e..1e4989e 100644 --- a/include/setting.h +++ b/include/setting.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/shortcut_service.h b/include/shortcut_service.h new file mode 100644 index 0000000..a7a146d --- /dev/null +++ b/include/shortcut_service.h @@ -0,0 +1,17 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* End of a file */ diff --git a/include/slave_life.h b/include/slave_life.h index 256bf59..821b1eb 100644 --- a/include/slave_life.h +++ b/include/slave_life.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/slave_rpc.h b/include/slave_rpc.h index bef921d..cfcbabb 100644 --- a/include/slave_rpc.h +++ b/include/slave_rpc.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/util.h b/include/util.h index 11ffe9c..a474c06 100644 --- a/include/util.h +++ b/include/util.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/include/xmonitor.h b/include/xmonitor.h index 8024276..55aadeb 100644 --- a/include/xmonitor.h +++ b/include/xmonitor.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkgmgr_livebox/include/dlist.h b/pkgmgr_livebox/include/dlist.h index 5cddb58..99e8443 100644 --- a/pkgmgr_livebox/include/dlist.h +++ b/pkgmgr_livebox/include/dlist.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkgmgr_livebox/src/dlist.c b/pkgmgr_livebox/src/dlist.c index 7a890c5..cf2cb63 100644 --- a/pkgmgr_livebox/src/dlist.c +++ b/pkgmgr_livebox/src/dlist.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkgmgr_livebox/src/service_register.c b/pkgmgr_livebox/src/service_register.c index 9965d8a..6c8536e 100644 --- a/pkgmgr_livebox/src/service_register.c +++ b/pkgmgr_livebox/src/service_register.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/res/edje/master.edc b/res/edje/master.edc index d50e4da..e64548a 100644 --- a/res/edje/master.edc +++ b/res/edje/master.edc @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/badge_service.c b/src/badge_service.c new file mode 100644 index 0000000..94fb941 --- /dev/null +++ b/src/badge_service.c @@ -0,0 +1,16 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + diff --git a/src/buffer_handler.c b/src/buffer_handler.c index 4ffaba7..1721e86 100644 --- a/src/buffer_handler.c +++ b/src/buffer_handler.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/client_life.c b/src/client_life.c index bc75d79..af8302d 100644 --- a/src/client_life.c +++ b/src/client_life.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/client_rpc.c b/src/client_rpc.c index edf4327..d87659f 100644 --- a/src/client_rpc.c +++ b/src/client_rpc.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/critical_log.c b/src/critical_log.c index 9136bf0..38ad835 100644 --- a/src/critical_log.c +++ b/src/critical_log.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/dead_monitor.c b/src/dead_monitor.c index 2576baf..91e3a23 100644 --- a/src/dead_monitor.c +++ b/src/dead_monitor.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/event.c b/src/event.c index 1bc98b7..818e66f 100644 --- a/src/event.c +++ b/src/event.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/fault_manager.c b/src/fault_manager.c index 0c44712..837bd17 100644 --- a/src/fault_manager.c +++ b/src/fault_manager.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/group.c b/src/group.c index c18a279..0adae6a 100644 --- a/src/group.c +++ b/src/group.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/instance.c b/src/instance.c index a4df9dc..db4ab42 100644 --- a/src/instance.c +++ b/src/instance.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -690,12 +690,17 @@ static inline int fork_package(struct inst_info *inst, const char *pkgname) inst->info = info; if (package_secured(info)) { - DbgPrint("Register the update timer for secured livebox [%s]\n", package_name(info)); - inst->update_timer = util_timer_add(inst->lb.period, update_timer_cb, inst); - if (!inst->update_timer) - ErrPrint("Failed to add an update timer for instance %s\n", inst->id); - else - timer_freeze(inst); /* Freeze the update timer as default */ + if (inst->lb.period > 0.0f) { + DbgPrint("Register the update timer for secured livebox [%s]\n", package_name(info)); + inst->update_timer = util_timer_add(inst->lb.period, update_timer_cb, inst); + if (!inst->update_timer) + ErrPrint("Failed to add an update timer for instance %s\n", inst->id); + else + timer_freeze(inst); /* Freeze the update timer as default */ + } else { + DbgPrint("secured livebox [%s] has no period (%lf)\n", package_name(info), inst->lb.period); + inst->update_timer = NULL; + } } return LB_STATUS_SUCCESS; @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/liveinfo.c b/src/liveinfo.c index 08257e4..d280fa3 100644 --- a/src/liveinfo.c +++ b/src/liveinfo.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/notification_service.c b/src/notification_service.c new file mode 100644 index 0000000..94fb941 --- /dev/null +++ b/src/notification_service.c @@ -0,0 +1,16 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + diff --git a/src/package.c b/src/package.c index 68b2d68..35e4742 100644 --- a/src/package.c +++ b/src/package.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/parser.c b/src/parser.c index 7efee09..3a4f4c7 100644 --- a/src/parser.c +++ b/src/parser.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/pkgmgr.c b/src/pkgmgr.c index 4b11fd3..2f65c13 100644 --- a/src/pkgmgr.c +++ b/src/pkgmgr.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/script_handler.c b/src/script_handler.c index ea709ed..0b0e789 100644 --- a/src/script_handler.c +++ b/src/script_handler.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/server.c b/src/server.c index 259e08d..27d4bbd 100644 --- a/src/server.c +++ b/src/server.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/service_common.c b/src/service_common.c new file mode 100644 index 0000000..15b5cb2 --- /dev/null +++ b/src/service_common.c @@ -0,0 +1,720 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#define _GNU_SOURCE +#include <stdio.h> +#include <pthread.h> +#include <secure_socket.h> +#include <packet.h> +#include <errno.h> +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> +#include <fcntl.h> + +#include <dlog.h> +#include <Eina.h> + +#include "service_common.h" +#include "util.h" +#include "debug.h" +#include "conf.h" + +#define EVT_CH 'e' +#define EVT_END_CH 'x' + +#define CRITICAL_SECTION_BEGIN(handle) \ +do { \ + int ret; \ + ret = pthread_mutex_lock(handle); \ + if (ret != 0) \ + ErrPrint("Failed to lock: %s\n", strerror(ret)); \ +} while (0) + +#define CRITICAL_SECTION_END(handle) \ +do { \ + int ret; \ + ret = pthread_mutex_unlock(handle); \ + if (ret != 0) \ + ErrPrint("Failed to unlock: %s\n", strerror(ret)); \ +} while (0) + + +int errno; + +/*! + * \note + * Server information and global (only in this file-scope) variables are defined + */ +#define EVT_READ 0 +#define EVT_WRITE 1 +#define EVT_MAX 2 + +struct service_context { + pthread_t thid; /*!< Server thread Id */ + int fd; /*!< Server socket handle */ + + pthread_t service_thid; + + Eina_List *tcb_list; /*!< TCB list, list of every thread for client connections */ + pthread_mutex_t tcb_list_lock; /*!< tcb_list has to be handled safely */ + + Eina_List *packet_list; + pthread_mutex_t packet_list_lock; + int evt_pipe[EVT_MAX]; + + int (*service_thread_main)(struct tcb *tcb, struct packet *packet, void *data); + void *service_thread_data; +}; + +struct packet_info { + struct tcb *tcb; + struct packet *packet; +}; + +/*! + * \note + * Thread Control Block + * - The main server will create a thread for every client connections. + * When a new client is comming to us, this TCB block will be allocated and initialized. + */ +struct tcb { /* Thread controll block */ + struct service_context *svc_ctx; + pthread_t thid; /*!< Thread Id */ + int fd; /*!< Connection handle */ + enum tcb_type type; +}; + +/*! + * \note + * Called from Client Thread + */ +static inline int tcb_destroy(struct service_context *svc_ctx, struct tcb *tcb) +{ + void *ret; + int status; + + CRITICAL_SECTION_BEGIN(&svc_ctx->tcb_list_lock); + svc_ctx->tcb_list = eina_list_remove(svc_ctx->tcb_list, tcb); + CRITICAL_SECTION_END(&svc_ctx->tcb_list_lock); + + /*! + * ASSERT(tcb->fd >= 0); + */ + secure_socket_destroy_handle(tcb->fd); + + status = pthread_join(tcb->thid, &ret); + if (status != 0) + ErrPrint("Unable to join a thread: %s\n", strerror(status)); + /*! + * \NOTE + * Waiting termination client thread + */ + free(tcb); + + return 0; +} + +/*! + * Do service for clients + * Routing packets to destination processes. + */ +static void *client_packet_pump_main(void *data) +{ + struct tcb *tcb = data; + struct service_context *svc_ctx = tcb->svc_ctx; + struct packet *packet; + fd_set set; + char *ptr; + int size; + int packet_offset; + int recv_offset; + int pid; + int ret; + char evt_ch = EVT_CH; + enum { + RECV_INIT, + RECV_HEADER, + RECV_PAYLOAD, + RECV_DONE, + } recv_state; + struct packet_info *packet_info; + + ret = 0; + recv_state = RECV_INIT; + /*! + * \note + * To escape from the switch statement, we use this ret value + */ + while (ret == 0) { + FD_ZERO(&set); + FD_SET(tcb->fd, &set); + ret = select(tcb->fd + 1, &set, NULL, NULL, NULL); + if (ret < 0) { + ret = -errno; + if (errno == EINTR) { + DbgPrint("INTERRUPTED\n"); + ret = 0; + continue; + } + ErrPrint("Error: %s\n",strerror(errno)); + break; + } else if (ret == 0) { + ErrPrint("Timeout\n"); + ret = -ETIMEDOUT; + break; + } + + if (FD_ISSET(tcb->fd, &set)) { + ErrPrint("Unexpected handler is toggled\n"); + ret = -EINVAL; + break; + } + + /*! + * \TODO + * Service!!! Receive packet & route packet + */ + switch (recv_state) { + case RECV_INIT: + size = packet_header_size(); + packet_offset = 0; + recv_offset = 0; + packet = NULL; + ptr = malloc(size); + if (!ptr) { + ErrPrint("Heap: %s\n", strerror(errno)); + ret = -ENOMEM; + break; + } + recv_state = RECV_HEADER; + /* Go through, don't break from here */ + case RECV_HEADER: + ret = secure_socket_recv(tcb->fd, ptr, size - recv_offset, &pid); + if (ret <= 0) { + if (ret == 0) + ret = -ECANCELED; + free(ptr); + break; + } + + recv_offset += ret; + ret = 0; + + if (recv_offset == size) { + packet = packet_build(packet, packet_offset, ptr, size); + free(ptr); + if (!packet) { + ret = -EFAULT; + break; + } + + packet_offset += recv_offset; + + recv_state = RECV_PAYLOAD; + recv_offset = 0; + size = packet_payload_size(packet); + + ptr = malloc(size); + if (!ptr) { + ErrPrint("Heap: %s\n", strerror(errno)); + ret = -ENOMEM; + } + } + break; + case RECV_PAYLOAD: + ret = secure_socket_recv(tcb->fd, ptr, size - recv_offset, &pid); + if (ret <= 0) { + if (ret == 0) + ret = -ECANCELED; + free(ptr); + break; + } + + recv_offset += ret; + ret = 0; + + if (recv_offset == size) { + packet = packet_build(packet, packet_offset, ptr, size); + free(ptr); + if (!packet) { + ret = -EFAULT; + break; + } + + packet_offset += recv_offset; + + recv_state = RECV_DONE; + recv_offset = 0; + } + break; + case RECV_DONE: + /*! + * Push this packet to the packet list with TCB + * Then the service main function will get this. + */ + packet_info = malloc(sizeof(*packet_info)); + if (!packet_info) { + ret = -errno; + ErrPrint("Heap: %s\n", strerror(errno)); + packet_destroy(packet); + break; + } + + packet_info->packet = packet; + packet_info->tcb = tcb; + + CRITICAL_SECTION_BEGIN(&svc_ctx->packet_list_lock); + svc_ctx->packet_list = eina_list_append(svc_ctx->packet_list, packet_info); + CRITICAL_SECTION_END(&svc_ctx->packet_list_lock); + + if (write(svc_ctx->evt_pipe[EVT_WRITE], &evt_ch, sizeof(evt_ch)) != sizeof(evt_ch)) { + ret = -errno; + ErrPrint("Unable to write a pipe\n"); + CRITICAL_SECTION_BEGIN(&svc_ctx->packet_list_lock); + svc_ctx->packet_list = eina_list_remove(svc_ctx->packet_list, packet_info); + CRITICAL_SECTION_END(&svc_ctx->packet_list_lock); + + packet_destroy(packet); + free(packet_info); + break; + } + DbgPrint("Packet received: %d bytes\n", packet_offset); + + recv_state = RECV_INIT; + break; + default: + /* Dead code */ + break; + } + } + + tcb_destroy(svc_ctx, tcb); + return (void *)ret; +} + +/*! + * \note + * Called from Server Main Thread + */ +static inline struct tcb *tcb_create(struct service_context *svc_ctx, int fd) +{ + struct tcb *tcb; + int status; + + tcb = malloc(sizeof(*tcb)); + if (!tcb) { + ErrPrint("Heap: %s\n", strerror(errno)); + return NULL; + } + + tcb->fd = fd; + tcb->svc_ctx = svc_ctx; + + status = pthread_create(&tcb->thid, NULL, client_packet_pump_main, tcb); + if (status != 0) { + ErrPrint("Unable to create a new thread: %s\n", strerror(status)); + free(tcb); + return NULL; + } + + CRITICAL_SECTION_BEGIN(&svc_ctx->tcb_list_lock); + svc_ctx->tcb_list = eina_list_append(svc_ctx->tcb_list, tcb); + CRITICAL_SECTION_END(&svc_ctx->tcb_list_lock); + + return tcb; +} + +/*! + * \note + * Called from Main Thread + */ +static inline void tcb_teminate_all(struct service_context *svc_ctx) +{ + struct tcb *tcb; + void *ret; + int status; + + /*! + * We don't need to make critical section on here. + * If we call this after terminate the server thread first. + * Then there is no other thread to access tcb_list. + */ + CRITICAL_SECTION_BEGIN(&svc_ctx->tcb_list_lock); + EINA_LIST_FREE(svc_ctx->tcb_list, tcb) { + /*! + * ASSERT(tcb->fd >= 0); + */ + secure_socket_destroy_handle(tcb->fd); + + status = pthread_join(tcb->thid, &ret); + if (status != 0) + ErrPrint("Unable to join a thread: %s\n", strerror(status)); + + free(tcb); + } + CRITICAL_SECTION_END(&svc_ctx->tcb_list_lock); +} + +/*! + * \NOTE + * Packet consuming thread. service thread. + */ +static void *service_main(void *data) +{ + struct service_context *svc_ctx = data; + fd_set set; + int ret; + char evt_ch; + struct packet_info *packet_info; + + while (1) { + FD_ZERO(&set); + FD_SET(svc_ctx->evt_pipe[EVT_READ], &set); + ret = select(svc_ctx->evt_pipe[EVT_READ] + 1, &set, NULL, NULL, NULL); + if (ret < 0) { + ret = -errno; + if (errno == EINTR) { + DbgPrint("INTERRUPTED\n"); + continue; + } + ErrPrint("Error: %s\n",strerror(errno)); + break; + } else if (ret == 0) { + ErrPrint("Timeout\n"); + ret = -ETIMEDOUT; + break; + } + + if (FD_ISSET(svc_ctx->evt_pipe[EVT_READ], &set)) { + ErrPrint("Unexpected handler is toggled\n"); + ret = -EINVAL; + break; + } + + if (read(svc_ctx->evt_pipe[EVT_READ], &evt_ch, sizeof(evt_ch)) != sizeof(evt_ch)) { + ErrPrint("Unable to read pipe: %s\n", strerror(errno)); + ret = -EIO; + break; + } + + if (evt_ch == EVT_END_CH) { + ErrPrint("Thread is terminated\n"); + ret = 0; + break; + } + + CRITICAL_SECTION_BEGIN(&svc_ctx->packet_list_lock); + packet_info = eina_list_nth(svc_ctx->packet_list, 0); + svc_ctx->packet_list = eina_list_remove(svc_ctx->packet_list, packet_info); + CRITICAL_SECTION_END(&svc_ctx->packet_list_lock); + + ret = svc_ctx->service_thread_main(packet_info->tcb, packet_info->packet, svc_ctx->service_thread_data); + if (ret < 0) + ErrPrint("Service thread returns: %d\n", ret); + + packet_destroy(packet_info->packet); + free(packet_info); + } + + return (void *)ret; +} + +/*! + * Accept new client connections + * And create a new thread for service. + */ +static void *server_main(void *data) +{ + struct service_context *svc_ctx = data; + fd_set set; + int ret; + int client_fd; + struct tcb *tcb; + + while (1) { + FD_ZERO(&set); + FD_SET(svc_ctx->fd, &set); + ret = select(svc_ctx->fd + 1, &set, NULL, NULL, NULL); + if (ret < 0) { + ret = -errno; + if (errno == EINTR) { + DbgPrint("INTERRUPTED\n"); + continue; + } + ErrPrint("Error: %s\n", strerror(errno)); + break; + } else if (ret == 0) { + ErrPrint("Timeout\n"); + ret = -ETIMEDOUT; + break; + } + + if (FD_ISSET(svc_ctx->fd, &set)) { + ErrPrint("Unexpected handler is toggled\n"); + ret = -EINVAL; + break; + } + + client_fd = secure_socket_get_connection_handle(svc_ctx->fd); + DbgPrint("New client connection arrived (%d)\n", client_fd); + if (client_fd < 0) { + ErrPrint("Failed to establish the client connection\n"); + ret = -EFAULT; + break; + } + + tcb = tcb_create(svc_ctx, client_fd); + if (!tcb) + secure_socket_destroy_handle(client_fd); + } + + return (void *)ret; +} + +HAPI struct service_context *service_common_create(const char *addr, int (*service_thread_main)(struct tcb *tcb, struct packet *packet, void *data), void *data) +{ + int status; + struct service_context *svc_ctx; + + if (!service_thread_main || !addr) { + ErrPrint("Invalid argument\n"); + return NULL; + } + + svc_ctx = malloc(sizeof(*svc_ctx)); + if (!svc_ctx) { + ErrPrint("Heap: %s\n", strerror(errno)); + return NULL; + } + + svc_ctx->fd = secure_socket_create_server(addr); + if (svc_ctx->fd < 0) { + free(svc_ctx); + return NULL; + } + + svc_ctx->service_thread_main = service_thread_main; + svc_ctx->service_thread_data = data; + + if (fcntl(svc_ctx->fd, F_SETFD, FD_CLOEXEC) < 0) + ErrPrint("fcntl: %s\n", strerror(errno)); + + if (fcntl(svc_ctx->fd, F_SETFL, O_NONBLOCK) < 0) + ErrPrint("fcntl: %s\n", strerror(errno)); + + if (pipe2(svc_ctx->evt_pipe, O_NONBLOCK | O_CLOEXEC) < 0) { + ErrPrint("pipe: %d\n", strerror(errno)); + secure_socket_destroy_handle(svc_ctx->fd); + free(svc_ctx); + return NULL; + } + + status = pthread_mutex_init(&svc_ctx->packet_list_lock, NULL); + if (status != 0) { + ErrPrint("Unable to create a mutex: %s\n", strerror(status)); + status = close(svc_ctx->evt_pipe[EVT_READ]); + if (status < 0) + ErrPrint("Error: %s\n", strerror(errno)); + status = close(svc_ctx->evt_pipe[EVT_WRITE]); + if (status < 0) + ErrPrint("Error: %s\n", strerror(errno)); + secure_socket_destroy_handle(svc_ctx->fd); + free(svc_ctx); + return NULL; + } + + status = pthread_mutex_init(&svc_ctx->tcb_list_lock, NULL); + if (status != 0) { + ErrPrint("Unable to initiate the mutex: %s\n", strerror(status)); + status = pthread_mutex_destroy(&svc_ctx->packet_list_lock); + if (status != 0) + ErrPrint("Error: %s\n", strerror(status)); + status = close(svc_ctx->evt_pipe[EVT_READ]); + if (status < 0) + ErrPrint("Error: %s\n", strerror(errno)); + status = close(svc_ctx->evt_pipe[EVT_WRITE]); + if (status < 0) + ErrPrint("Error: %s\n", strerror(errno)); + secure_socket_destroy_handle(svc_ctx->fd); + free(svc_ctx); + return NULL; + } + + status = pthread_create(&svc_ctx->thid, NULL, server_main, svc_ctx); + if (status != 0) { + ErrPrint("Unable to create a thread for shortcut service: %s\n", strerror(status)); + status = pthread_mutex_destroy(&svc_ctx->tcb_list_lock); + if (status != 0) + ErrPrint("Error: %s\n", strerror(status)); + status = pthread_mutex_destroy(&svc_ctx->packet_list_lock); + if (status != 0) + ErrPrint("Error: %s\n", strerror(status)); + status = close(svc_ctx->evt_pipe[EVT_READ]); + if (status != 0) + ErrPrint("Error: %s\n", strerror(status)); + status = close(svc_ctx->evt_pipe[EVT_WRITE]); + if (status != 0) + ErrPrint("Error: %s\n", strerror(status)); + secure_socket_destroy_handle(svc_ctx->fd); + free(svc_ctx); + return NULL; + } + + status = pthread_create(&svc_ctx->service_thid, NULL, service_main, svc_ctx); + if (status != 0) { + void *ret; + ErrPrint("Unable to create a thread for shortcut service: %s\n", strerror(status)); + + secure_socket_destroy_handle(svc_ctx->fd); + + status = pthread_join(svc_ctx->thid, &ret); + if (status != 0) + ErrPrint("Error: %s\n", strerror(status)); + + status = pthread_mutex_destroy(&svc_ctx->tcb_list_lock); + if (status != 0) + ErrPrint("Error: %s\n", strerror(status)); + status = pthread_mutex_destroy(&svc_ctx->packet_list_lock); + if (status != 0) + ErrPrint("Error: %s\n", strerror(status)); + status = close(svc_ctx->evt_pipe[EVT_READ]); + if (status < 0) + ErrPrint("Error: %s\n", strerror(errno)); + status = close(svc_ctx->evt_pipe[EVT_WRITE]); + if (status < 0) + ErrPrint("Error: %s\n", strerror(errno)); + secure_socket_destroy_handle(svc_ctx->fd); + free(svc_ctx); + return NULL; + } + + return svc_ctx; +} + +HAPI int service_common_destroy(struct service_context *svc_ctx) +{ + int status; + void *ret; + char evt_ch = EVT_END_CH; + + if (!svc_ctx) + return -EINVAL; + + /*! + * \note + * Terminate server thread + */ + secure_socket_destroy_handle(svc_ctx->fd); + status = pthread_join(svc_ctx->thid, &ret); + if (status != 0) + ErrPrint("Join: %s\n", strerror(status)); + /*! + * \note + * Terminate all client threads. + */ + tcb_teminate_all(svc_ctx); + + /* Emit a finish event */ + if (write(svc_ctx->evt_pipe[EVT_WRITE], &evt_ch, sizeof(evt_ch)) == sizeof(evt_ch)) + ErrPrint("write: %s\n", strerror(errno)); + + /* Waiting */ + status = pthread_join(svc_ctx->service_thid, &ret); + if (status != 0) + ErrPrint("Join: %s\n", strerror(status)); + + status = pthread_mutex_destroy(&svc_ctx->tcb_list_lock); + if (status != 0) + ErrPrint("Unable to destroy a mutex: %s\n", strerror(status)); + + status = pthread_mutex_destroy(&svc_ctx->packet_list_lock); + if (status != 0) + ErrPrint("Unable to destroy a mutex: %s\n", strerror(status)); + + status = close(svc_ctx->evt_pipe[EVT_WRITE]); + status = close(svc_ctx->evt_pipe[EVT_READ]); + free(svc_ctx); + return 0; +} + +HAPI int tcb_fd(struct tcb *tcb) +{ + if (!tcb) + return -EINVAL; + + return tcb->fd; +} + +HAPI int tcb_client_type(struct tcb *tcb) +{ + if (!tcb) + return -EINVAL; + + return tcb->type; +} + +HAPI int tcb_client_type_set(struct tcb *tcb, enum tcb_type type) +{ + if (!tcb) + return -EINVAL; + + tcb->type = type; + return 0; +} + +HAPI struct service_context *tcb_svc_ctx(struct tcb *tcb) +{ + if (!tcb) + return NULL; + + return tcb->svc_ctx; +} + +HAPI int service_common_unicast_packet(struct tcb *tcb, struct packet *packet) +{ + if (!tcb || !packet) + return -EINVAL; + + return secure_socket_send(tcb->fd, (void *)packet_data(packet), packet_size(packet)); +} + +HAPI int service_common_multicast_packet(struct tcb *tcb, struct packet *packet, int type) +{ + Eina_List *l; + struct tcb *target; + struct service_context *svc_ctx; + int ret; + + if (!tcb || !packet) + return -EINVAL; + + svc_ctx = tcb->svc_ctx; + + CRITICAL_SECTION_BEGIN(&svc_ctx->tcb_list_lock); + EINA_LIST_FOREACH(svc_ctx->tcb_list, l, target) { + if (target == tcb || target->type != type) + continue; + + ret = secure_socket_send(target->fd, (void *)packet_data(packet), packet_size(packet)); + if (ret < 0) + ErrPrint("Failed to send packet: %d\n", ret); + } + CRITICAL_SECTION_END(&svc_ctx->tcb_list_lock); + + return 0; +} + +/* End of a file */ diff --git a/src/setting.c b/src/setting.c index d0119b1..8eaceca 100644 --- a/src/setting.c +++ b/src/setting.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/shortcut_service.c b/src/shortcut_service.c new file mode 100644 index 0000000..774d814 --- /dev/null +++ b/src/shortcut_service.c @@ -0,0 +1,183 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <stdio.h> + +#include <Eina.h> + +#include <dlog.h> +#include <livebox-errno.h> +#include <packet.h> + +#include <Eina.h> + +#include "service_common.h" +#include "debug.h" +#include "util.h" + +#define SHORTCUT_ADDR "/tmp/.shortcut.service" + +static struct info { + Eina_List *context_list; + struct service_context *svc_ctx; +} s_info = { + .context_list = NULL, /*!< \WARN: This is only used for SERVICE THREAD */ + .svc_ctx = NULL, /*!< \WARN: This is only used for MAIN THREAD */ +}; + +struct context { + struct tcb *tcb; + double seq; +}; + +/*! + * SERVICE THREAD + */ +static inline int put_reply_context(struct tcb *tcb, double seq) +{ + struct context *ctx; + + ctx = malloc(sizeof(*ctx)); + if (!ctx) { + ErrPrint("Heap: %s\n", strerror(errno)); + return -ENOMEM; + } + + ctx->tcb = tcb; + ctx->seq = seq; /* Could we this sequence value is uniq? */ + + s_info.context_list = eina_list_append(s_info.context_list, ctx); + return 0; +} + +/*! + * SERVICE THREAD + */ +static inline struct tcb *get_reply_context(double seq) +{ + Eina_List *l; + Eina_List *n; + struct context *ctx; + struct tcb *tcb; + + tcb = NULL; + EINA_LIST_FOREACH_SAFE(s_info.context_list, l, n, ctx) { + if (ctx->seq != seq) + continue; + + s_info.context_list = eina_list_remove(s_info.context_list, ctx); + tcb = ctx->tcb; + free(ctx); + break; + } + + return tcb; +} + +/*! + * SERVICE THREAD + */ +static int service_thread_main(struct tcb *tcb, struct packet *packet, void *data) +{ + const char *command; + + command = packet_command(packet); + if (!command) { + ErrPrint("Invalid command\n"); + return -EINVAL; + } + + switch (packet_type(packet)) { + case PACKET_REQ: + /* Need to send reply packet */ + DbgPrint("REQ: Command: [%s]\n", command); + if (!strcmp(command, "register_service")) { + /*! + * To multicast event packets to the service clients + */ + tcb_client_type_set(tcb, TCB_CLIENT_TYPE_SERVICE); + break; + } + + if (service_common_multicast_packet(tcb, packet, TCB_CLIENT_TYPE_SERVICE) < 0) + ErrPrint("Unable to send service request packet\n"); + else + (void)put_reply_context(tcb, packet_seq(packet)); + break; + case PACKET_REQ_NOACK: + /* Doesn't need to send reply packet */ + DbgPrint("REQ_NOACK: Command: [%s]\n", command); + if (!strcmp(command, "register_service")) { + tcb_client_type_set(tcb, TCB_CLIENT_TYPE_SERVICE); + break; + } + + if (service_common_multicast_packet(tcb, packet, TCB_CLIENT_TYPE_SERVICE) < 0) + ErrPrint("Unable to send service reuqest packet\n"); + break; + case PACKET_ACK: + /* Okay, client(or app) send a reply packet to us. */ + DbgPrint("ACK: Command: [%s]\n", command); + tcb = get_reply_context(packet_seq(packet)); + if (!tcb) { + ErrPrint("There is no proper context\n"); + break; + } + + if (service_common_unicast_packet(tcb, packet) < 0) + ErrPrint("Unable to send reply packet\n"); + break; + default: + ErrPrint("Packet type is not valid[%s]\n", command); + return -EINVAL; + } + + /*! + * return value has no meanning, + * it will be printed by dlogutil. + */ + return 0; +} + + +/*! + * MAIN THREAD + * Do not try to do anyother operation in these functions + */ + +int service_shortcut_init(void) +{ + if (s_info.svc_ctx) { + ErrPrint("Already initialized\n"); + return LB_STATUS_ERROR_ALREADY; + } + + s_info.svc_ctx = service_common_create(SHORTCUT_ADDR, service_thread_main, NULL); + if (!s_info.svc_ctx) + return LB_STATUS_ERROR_FAULT; + + return LB_STATUS_SUCCESS; +} + +int service_shortcut_fini(void) +{ + if (!s_info.svc_ctx) + return LB_STATUS_ERROR_INVALID; + + service_common_destroy(s_info.svc_ctx); + return LB_STATUS_SUCCESS; +} + +/* End of a file */ diff --git a/src/slave_life.c b/src/slave_life.c index 81559a0..eac009d 100644 --- a/src/slave_life.c +++ b/src/slave_life.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/slave_rpc.c b/src/slave_rpc.c index 47428bd..570852e 100644 --- a/src/slave_rpc.c +++ b/src/slave_rpc.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/xmonitor.c b/src/xmonitor.c index ee3f578..039973b 100644 --- a/src/xmonitor.c +++ b/src/xmonitor.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/util_liveinfo/include/liveinfo.h b/util_liveinfo/include/liveinfo.h index 92efdbb..94fb941 100644 --- a/util_liveinfo/include/liveinfo.h +++ b/util_liveinfo/include/liveinfo.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/util_liveinfo/src/liveinfo.c b/util_liveinfo/src/liveinfo.c index 7278f28..bd2dccf 100644 --- a/util_liveinfo/src/liveinfo.c +++ b/util_liveinfo/src/liveinfo.c @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, |