summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSehong Na <sehong.na@samsung.com>2014-05-31 12:34:53 +0900
committerSehong Na <sehong.na@samsung.com>2014-05-31 12:34:53 +0900
commit5dbf476533e25bc06754b3634ed83d1611f0dea8 (patch)
treecea9710fbf7f5f71c1863f0bd5f1bc95d0ca2160
downloadcrash-worker-sdk-5dbf476533e25bc06754b3634ed83d1611f0dea8.tar.gz
crash-worker-sdk-5dbf476533e25bc06754b3634ed83d1611f0dea8.tar.bz2
crash-worker-sdk-5dbf476533e25bc06754b3634ed83d1611f0dea8.zip
-rwxr-xr-xAUTHORS3
-rw-r--r--CMakeLists.txt18
-rwxr-xr-xLICENSE.APLv2205
-rwxr-xr-xNOTICE3
-rwxr-xr-xall_log_dump/CMakeLists.txt2
-rwxr-xr-xall_log_dump/all_log_dump.sh332
-rw-r--r--crash-popup/CMakeLists.txt100
-rw-r--r--crash-popup/popup_po/CMakeLists.txt24
-rwxr-xr-xcrash-popup/popup_po/ar.po6
-rwxr-xr-xcrash-popup/popup_po/az.po6
-rwxr-xr-xcrash-popup/popup_po/bg.po6
-rwxr-xr-xcrash-popup/popup_po/ca.po6
-rwxr-xr-xcrash-popup/popup_po/cs.po6
-rwxr-xr-xcrash-popup/popup_po/da.po6
-rwxr-xr-xcrash-popup/popup_po/de_DE.po6
-rwxr-xr-xcrash-popup/popup_po/el_GR.po6
-rwxr-xr-xcrash-popup/popup_po/en.po6
-rwxr-xr-xcrash-popup/popup_po/en_PH.po6
-rwxr-xr-xcrash-popup/popup_po/en_US.po6
-rwxr-xr-xcrash-popup/popup_po/es_ES.po6
-rwxr-xr-xcrash-popup/popup_po/es_US.po6
-rwxr-xr-xcrash-popup/popup_po/et.po6
-rwxr-xr-xcrash-popup/popup_po/eu.po6
-rwxr-xr-xcrash-popup/popup_po/fi.po6
-rwxr-xr-xcrash-popup/popup_po/fr_CA.po6
-rwxr-xr-xcrash-popup/popup_po/fr_FR.po6
-rwxr-xr-xcrash-popup/popup_po/ga.po6
-rwxr-xr-xcrash-popup/popup_po/gl.po6
-rwxr-xr-xcrash-popup/popup_po/hi.po6
-rwxr-xr-xcrash-popup/popup_po/hr.po6
-rwxr-xr-xcrash-popup/popup_po/hu.po6
-rwxr-xr-xcrash-popup/popup_po/hy.po6
-rwxr-xr-xcrash-popup/popup_po/is.po6
-rwxr-xr-xcrash-popup/popup_po/it_IT.po6
-rwxr-xr-xcrash-popup/popup_po/ja_JP.po6
-rwxr-xr-xcrash-popup/popup_po/ka.po6
-rwxr-xr-xcrash-popup/popup_po/kk.po6
-rwxr-xr-xcrash-popup/popup_po/ko_KR.po6
-rwxr-xr-xcrash-popup/popup_po/lt.po6
-rwxr-xr-xcrash-popup/popup_po/lv.po6
-rwxr-xr-xcrash-popup/popup_po/mk.po6
-rwxr-xr-xcrash-popup/popup_po/nb.po6
-rwxr-xr-xcrash-popup/popup_po/nl_NL.po6
-rwxr-xr-xcrash-popup/popup_po/pl.po6
-rwxr-xr-xcrash-popup/popup_po/pt_BR.po6
-rwxr-xr-xcrash-popup/popup_po/pt_PT.po6
-rwxr-xr-xcrash-popup/popup_po/ro.po6
-rwxr-xr-xcrash-popup/popup_po/ru_RU.po6
-rwxr-xr-xcrash-popup/popup_po/sk.po6
-rwxr-xr-xcrash-popup/popup_po/sl.po6
-rwxr-xr-xcrash-popup/popup_po/sr.po6
-rwxr-xr-xcrash-popup/popup_po/sv.po6
-rwxr-xr-xcrash-popup/popup_po/tr_TR.po6
-rwxr-xr-xcrash-popup/popup_po/uk.po6
-rwxr-xr-xcrash-popup/popup_po/uz.po6
-rwxr-xr-xcrash-popup/popup_po/zh_CN.po6
-rwxr-xr-xcrash-popup/popup_po/zh_HK.po6
-rwxr-xr-xcrash-popup/popup_po/zh_SG.po6
-rwxr-xr-xcrash-popup/popup_po/zh_TW.po6
-rw-r--r--crash-popup/src/crash-popup.c405
-rw-r--r--crash-popup/src/crash-popup.h73
-rw-r--r--crash-popup/src/util_log.h64
-rw-r--r--crash-worker/CMakeLists.txt62
-rw-r--r--crash-worker/crash-worker.c1158
-rw-r--r--crash-worker/crash-worker.h177
-rw-r--r--crash-worker/util.c299
-rw-r--r--crash-worker/util.h43
-rw-r--r--crash-worker/util_log.h71
-rwxr-xr-xdata/org.tizen.crash-popup.pngbin0 -> 9181 bytes
-rw-r--r--data/org.tizen.crash-popup.xml8
-rw-r--r--edcs/crash-popup.edc140
-rw-r--r--packaging/crash-worker-sdk.manifest32
-rw-r--r--packaging/crash-worker-sdk.spec116
-rw-r--r--packaging/org.tizen.crash-popup.manifest11
-rw-r--r--packaging/org.tizen.crash-popup.rule20
75 files changed, 3672 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100755
index 0000000..2190840
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,3 @@
+juho son <juho80.son at samsung dot com>
+Suchang Woo <suchang.woo at samsung dot com>
+kyungmin Park <kyungmin Park at samsung dot com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..4487fe5
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,18 @@
+####### Crash-worker #############
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(crash-worker C)
+
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(EXEC_PREFIX "\${prefix}")
+SET(LIBDIR "\${prefix}/lib")
+SET(INCLUDEDIR "\${prefix}/include")
+
+# Sub modules
+ADD_SUBDIRECTORY(crash-worker)
+ADD_SUBDIRECTORY(crash-popup)
+ADD_SUBDIRECTORY(all_log_dump)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.APLv2 DESTINATION /usr/share/license RENAME crash-worker-sdk)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.APLv2 DESTINATION /usr/share/license RENAME org.tizen.crash-popup)
+############## END ##############
+
diff --git a/LICENSE.APLv2 b/LICENSE.APLv2
new file mode 100755
index 0000000..8aa906c
--- /dev/null
+++ b/LICENSE.APLv2
@@ -0,0 +1,205 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
+
+ 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/NOTICE b/NOTICE
new file mode 100755
index 0000000..0e0f016
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,3 @@
+Copyright (c) Samsung Electronics Co., Ltd. All rights reserved.
+Except as noted, this software is licensed under Apache License, Version 2.
+Please, see the LICENSE.APLv2 file for Apache License terms and conditions.
diff --git a/all_log_dump/CMakeLists.txt b/all_log_dump/CMakeLists.txt
new file mode 100755
index 0000000..dd68dd6
--- /dev/null
+++ b/all_log_dump/CMakeLists.txt
@@ -0,0 +1,2 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/all_log_dump/all_log_dump.sh DESTINATION /usr/bin)
diff --git a/all_log_dump/all_log_dump.sh b/all_log_dump/all_log_dump.sh
new file mode 100755
index 0000000..a98487d
--- /dev/null
+++ b/all_log_dump/all_log_dump.sh
@@ -0,0 +1,332 @@
+#!/bin/sh
+
+PARAM1=$1
+PARAM2=$2
+PARAM3=$3
+
+#--------------------------------------
+# Setup log dump path
+#--------------------------------------
+TIMESTAMP=`date +%m%d_%H%M`
+TIMESTAMP_DFMS=`date +%Y%m%d%H%M%S`
+LOG_SRC_DIR=/opt/var/log
+LOG_DST_DIR_BASE=/opt/usr/media/SLP_debug
+if [ "$PARAM1" = "dfms" ]; then
+ LOG_DIR=factory_${PARAM2}_${PARAM3}_dumpstate${TIMESTAMP_DFMS}
+else
+ LOG_DIR=log_dump_${TIMESTAMP}
+fi
+LOG_DST_DIR=${LOG_DST_DIR_BASE}/${LOG_DIR}
+MOD_LOG_DIR=${LOG_DST_DIR}/module_log
+CP_LOG_DIR=${LOG_DST_DIR}/modem_log
+SCAN_IGNORE=${LOG_DST_DIR_BASE}/.scan_ignore
+mkdir -p ${LOG_DST_DIR_BASE}
+chown app:app ${LOG_DST_DIR_BASE}
+if [ ! -e ${SCAN_IGNORE} ]; then
+ touch ${SCAN_IGNORE}
+fi
+#--------------------------------------
+# LCD on off control
+#--------------------------------------
+HW_NAME=`cat /proc/cpuinfo | grep Hardware | awk -F ':' '{print $2}' | tr -d ' '`
+if [ "${HW_NAME}" = "U1SLP" ] || [ "${HW_NAME}" = "U1HD" || [ "${HW_NAME}" = "TRATS" ]; then
+ LCD_BLANK=/sys/class/graphics/fb3/blank
+else
+ LCD_BLANK=/sys/class/graphics/fb0/blank
+fi
+
+lcd_on() {
+ echo 0 > ${LCD_BLANK}
+}
+
+lcd_off() {
+ echo 4 > ${LCD_BLANK}
+}
+
+lcd_blank1() {
+ lcd_on
+ usleep 200
+ lcd_off
+ usleep 200
+}
+
+lcd_blank() {
+ count=$1
+ while [ ${count} -gt 0 ]
+ do
+ lcd_blank1
+ count=`expr ${count} - 1`
+ done
+}
+
+if [ "$PARAM1" = "hardkey" ]; then
+ lcd_blank 3
+ lcd_on
+ # enable sdb
+ /usr/bin/set_usb_debug.sh --set
+ # change atd to console mode
+ pkill -SIGUSR1 atd-server
+else
+ if [ "$PARAM1" = "z" ]; then
+ LOG_ZIP_DST_FILE_NAME=$2
+ fi
+fi
+
+
+#--------------------------------------
+# common logs - /opt/var/log
+#--------------------------------------
+COMMMON_LOG_DIR=${LOG_DST_DIR}/var_log
+mkdir -p ${COMMMON_LOG_DIR}
+cp -fr ${LOG_SRC_DIR}/* ${COMMMON_LOG_DIR}
+
+
+dlogutil -d -v time -f ${LOG_DST_DIR}/dlog_dump.log
+ps -aux > ${LOG_DST_DIR}/ps.log
+memps -a > ${LOG_DST_DIR}/memps.log
+top -bc -n 1 > ${LOG_DST_DIR}/top.log
+
+
+#--------------------------------------
+# modem
+#--------------------------------------
+mkdir -p ${CP_LOG_DIR}
+mv -f /opt/etc/modem/err/* ${CP_LOG_DIR}
+
+
+# call each module's log dump script
+
+#--------------------------------------
+# bluetooth
+#--------------------------------------
+BT_DEBUG=${MOD_LOG_DIR}/bluetooth
+mkdir -p ${BT_DEBUG}
+#cp -rf /var/lib/bluetooth/* ${BT_DEBUG}
+tar -cvf ${BT_DEBUG}/bt.log.tar /var/lib/bluetooth
+
+#--------------------------------------
+# contacts-svc
+#--------------------------------------
+CONTACT_SVC_DEBUG=${MOD_LOG_DIR}/contacts-svc
+mkdir -p ${CONTACT_SVC_DEBUG}
+cp /opt/dbspace/.contacts-svc.db ${CONTACT_SVC_DEBUG}
+
+
+#--------------------------------------
+# eas
+#--------------------------------------
+EAS_DEBUG=${MOD_LOG_DIR}/eas
+mkdir -p ${EAS_DEBUG}
+cp /opt/usr/dbspace/.assync* ${EAS_DEBUG}
+cp /opt/usr/dbspace/.eas-common* ${EAS_DEBUG}
+cp -fa /opt/usr/data/eas-engine ${EAS_DEBUG}
+
+
+#--------------------------------------
+# ims
+#--------------------------------------
+IMS_DEBUG=${MOD_LOG_DIR}/ims
+mkdir -p ${IMS_DEBUG}
+cp /opt/apps/com.samsung.rcs-im/data/db/.rcs-im.db ${IMS_DEBUG}
+cp /opt/share/ims/* ${IMS_DEBUG}
+
+
+
+#--------------------------------------
+# kap
+#--------------------------------------
+KAP_DEBUG=${MOD_LOG_DIR}/kap
+mkdir -p ${KAP_DEBUG}
+vconftool get -r db/ > ${KAP_DEBUG}/vconf_db.log
+vconftool get -r memory/ > ${KAP_DEBUG}/vconf_memory.log
+
+
+
+#--------------------------------------
+# kies-via-wifi
+#--------------------------------------
+KW_DEBUG=${MOD_LOG_DIR}/kies_via_wifi
+mkdir -p ${KW_DEBUG}
+cp -f /opt/dbspace/.kies_device.db* ${KW_DEBUG}
+
+
+#--------------------------------------
+# mobex-for-kies
+#--------------------------------------
+TT_DEBUG=${MOD_LOG_DIR}/mobex-for-kies
+mkdir -p ${TT_DEBUG}
+cp /tmp/hostapd.log ${TT_DEBUG}
+cp -rf /opt/dbspace/.kiessyncagent.db ${TT_DEBUG}
+cp -rf /opt/data/mobex/mobex_sync_id ${TT_DEBUG}
+cp -rf /opt/data/sync-agent-framework/db/.pc_sync_* ${TT_DEBUG}
+
+vconftool get -r db/ > ${TT_DEBUG}/vconf_db.log
+vconftool get -r memory/ > ${TT_DEBUG}/vconf_memory.log
+
+
+#--------------------------------------
+# vt
+#--------------------------------------
+VT_DEBUG=${MOD_LOG_DIR}/vt
+mkdir -p ${VT_DEBUG}
+cp -rf /opt/etc/vt_debug/ ${VT_DEBUG}
+
+
+#--------------------------------------
+# nfc
+#--------------------------------------
+NFC_DEBUG=${MOD_LOG_DIR}/nfc
+mkdir -p ${NFC_DEBUG}
+cp -rf /opt/etc/nfc_debug/ ${NFC_DEBUG}
+cp -rf /opt/data/nfc-manager-daemon/message/ ${NFC_DEBUG}
+
+
+#--------------------------------------
+# oma-ds
+#--------------------------------------
+OMA_DEBUG=${MOD_LOG_DIR}/oma-ds
+mkdir -p ${OMA_DEBUG}
+cp -rf /opt/dbspace/.omasyncagent.db* ${OMA_DEBUG}
+
+vconftool get -r db/ > ${OMA_DEBUG}/vconf_db.log
+vconftool get -r memory/ > ${OMA_DEBUG}/vconf_memory.log
+
+
+#--------------------------------------
+# tethering
+#--------------------------------------
+TETH_DEBUG=${MOD_LOG_DIR}/tethering
+mkdir -p ${TETH_DEBUG}
+cp /tmp/hostapd.log ${TETH_DEBUG}
+cp -rf /tmp/dnsmasq.conf /opt/var/lib/misc/* ${TETH_DEBUG}
+
+vconftool get db/mobile_hotspot > ${TETH_DEBUG}/vconf_db.log
+vconftool get memory/mobile_hotspot > ${TETH_DEBUG}/vconf_memory.log
+iptables -t nat -L -vv > ${TETH_DEBUG}/iptables_nat.log
+iptables -L -vv > ${TETH_DEBUG}/iptables_filter.log
+
+
+#--------------------------------------
+# winsys
+#--------------------------------------
+export DISPLAY=:0.0
+WINSYS_DEBUG=${MOD_LOG_DIR}/winsys
+mkdir -p ${WINSYS_DEBUG}
+xinfo -p 2> ${WINSYS_DEBUG}/ping.log
+xinfo -xwd_topvwins ${WINSYS_DEBUG}
+e_comp_util -l DUMP_INFO -f ${WINSYS_DEBUG}/e_comp.log
+border_win_info -p ALL -f ${WINSYS_DEBUG}/e_illume2.log
+cp -af /opt/var/log/keygrab_status.txt ${WINSYS_DEBUG}
+screenshot bmp ${WINSYS_DEBUG}/slp_screenshot.bmp
+xinfo -topvwins 2> ${WINSYS_DEBUG}/xinfo_topvwins.txt
+
+xberc clist > ${WINSYS_DEBUG}/clist.log
+
+xberc drmmode_dump > ${WINSYS_DEBUG}/drmmode_dump.log
+
+find /var/log/ -name "*Xorg*" -exec cp {} ${WINSYS_DEBUG}/ \;
+
+
+#--------------------------------------
+# web-apps
+#--------------------------------------
+WEBAPP_DEBUG=${MOD_LOG_DIR}/webapp
+mkdir -p ${WEBAPP_DEBUG}
+
+_app_dir_prefix=/opt/apps
+_log_file=${WEBAPP_DEBUG}/web-apps.log
+
+get_widget_list() {
+ _widget_list=`sqlite3 /opt/dbspace/.wrt.db "select pkgname from WidgetInfo;"`
+ return _widget_list
+}
+
+tar_widget() {
+ _tar_pkg=$1
+ tar zcvf ${WEBAPP_DEBUG}/$_tar_pkg.tgz $_app_dir_prefix/$_tar_pkg >> $_log_file
+}
+
+check_widget_running_and_tar() {
+ _current_widget=$1
+ is_running=`aul_test is_run $_current_widget | grep "is running"`
+ if [ -n "$is_running" ]; then
+ echo "$_current_widget widget running" >> $_log_file
+ tar_widget $_current_widget
+ else
+ echo "$_current_widget widget not running" >> $_log_file
+ fi
+}
+
+tar_running_widgets() {
+ _widget_list=`sqlite3 /opt/dbspace/.wrt.db "select pkgname from WidgetInfo;"`
+ for _widget_pkg_name in $_widget_list
+ do
+ check_widget_running_and_tar $_widget_pkg_name
+ done
+}
+
+get_logs() {
+ echo "wrt-launcher -l" >> $_log_file
+ wrt-launcher -l >> $_log_file
+ echo "====================================" >> $_log_file
+}
+
+get_logs
+tar_running_widgets
+
+#--------------------------------------
+# ChatON
+#--------------------------------------
+CHATON_DEBUG=${MOD_LOG_DIR}/chaton
+mkdir -p ${CHATON_DEBUG}
+cp -rf /opt/apps/xnq5eh9vop/shared/data/debug/ ${CHATON_DEBUG}
+cp -rf /opt/apps/xnq5eh9vop/shared/data/ssm.db ${CHATON_DEBUG}
+
+#--------------------------------------
+# power-manager
+#--------------------------------------
+pmctrl log
+PM_DEBUG=${MOD_LOG_DIR}/power-manager
+mkdir -p ${PM_DEBUG}
+cp -rf /opt/var/log/pm_state.log ${PM_DEBUG}
+
+#=====================================
+# ap log dump copy
+#=====================================
+AP_LOG_DIR=${LOG_DST_DIR}/ap_log
+mkdir -p ${AP_LOG_DIR}
+cp -rf /opt/usr/share/crash/core/* ${AP_LOG_DIR}
+cp -rf /opt/usr/share/crash/dump/* ${AP_LOG_DIR}
+rm -rf /opt/usr/share/crash/core/*
+rm -rf /opt/usr/share/crash/dump/*
+rm -rf /opt/usr/share/crash/ticket/*
+
+#======================================
+# log dump done
+#======================================
+# change owner so that dump can by read by PC via MTP
+cd /opt/usr/media
+chown app:app -R ${LOG_DST_DIR_BASE}
+chmod 777 -R ${LOG_DST_DIR_BASE}
+
+if [ "${PARAM1}" = "z" ]; then
+ tar zcf ${LOG_ZIP_DST_FILE_NAME} -C ${LOG_DST_DIR_BASE} ${LOG_DIR}
+ chown app:app ${LOG_ZIP_DST_FILE_NAME}
+ rm -rf ${LOG_DST_DIR}
+ echo tar zcf ${LOG_ZIP_DST_FILE_NAME} -C ${LOG_DST_DIR_BASE} ${LOG_DIR}
+ echo rm -rf ${LOG_DST_DIR}
+fi
+
+if [ "${PARAM1}" = "hardkey" ]; then
+
+if [ "${HW_NAME}" = "U1SLP" ] || [ "${HW_NAME}" = "U1HD" || [ "${HW_NAME}" = "TRATS" ]; then
+ echo AP > /sys/devices/platform/uart-select/path
+else
+ echo AP > /sys/devices/virtual/sec/switch/uart_sel
+fi
+
+lcd_blank 3
+lcd_on
+fi
+
+
diff --git a/crash-popup/CMakeLists.txt b/crash-popup/CMakeLists.txt
new file mode 100644
index 0000000..3869599
--- /dev/null
+++ b/crash-popup/CMakeLists.txt
@@ -0,0 +1,100 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(crash-popup C)
+
+SET(SRCS
+ src/crash-popup.c
+)
+
+SET(VENDOR "tizen")
+SET(PACKAGE ${PROJECT_NAME})
+SET(PKGNAME "org.${VENDOR}.${PACKAGE}")
+SET(EXENAME "crash-popup")
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(BINDIR "${PREFIX}/apps/${PKGNAME}/bin")
+SET(RESDIR "${PREFIX}/apps/${PKGNAME}/res")
+SET(DATADIR "${PREFIX}/data")
+SET(LOCALEDIR "${RESDIR}/locale")
+SET(ICONDIR "${PREFIX}/share/icons/default/small")
+SET(IMAGEDIR "${RESDIR}/images/${PACKAGE}")
+SET(EDJDIR "${RESDIR}/edje")
+
+IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+ SET(CMAKE_BUILD_TYPE "Release")
+ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs REQUIRED
+ appcore-efl
+ elementary
+ ecore-file
+ ecore-input
+ ecore-x
+ ecore
+ evas
+ edje
+ vconf
+ utilX
+ ecore-imf
+ appcore-common
+ ecore-imf
+ ail
+)
+
+FOREACH(flag ${pkgs_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
+SET(CMAKE_C_FLAGS_RELEASE "-O2")
+
+FIND_PROGRAM(UNAME NAMES uname)
+EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
+IF("${ARCH}" STREQUAL "arm")
+ ADD_DEFINITIONS("-DTARGET")
+ MESSAGE("add -DTARGET")
+ENDIF("${ARCH}" STREQUAL "arm")
+
+ADD_DEFINITIONS("-DVENDOR=\"${VENDOR}\"")
+ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"")
+ADD_DEFINITIONS("-DPACKAGE_NAME=\"${PKGNAME}\"")
+ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"")
+ADD_DEFINITIONS("-DRESDIR=\"${RESDIR}\"")
+ADD_DEFINITIONS("-DDATADIR=\"${DATADIR}\"")
+ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"")
+ADD_DEFINITIONS("-DICONDIR=\"${ICONDIR}\"")
+ADD_DEFINITIONS("-DIMAGEDIR=\"${IMAGEDIR}\"")
+ADD_DEFINITIONS("-DEDJDIR=\"${EDJDIR}\"")
+
+#SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed")
+SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed")
+
+ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS})
+
+# install edj
+ADD_CUSTOM_TARGET(crash-popup.edj
+ COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/../images
+ ${CMAKE_SOURCE_DIR}/edcs/crash-popup.edc ${CMAKE_BINARY_DIR}/${PROJECT_NAME}/crash-popup.edj
+ DEPENDS ${CMAKE_SOURCE_DIR}/edcs/crash-popup.edc
+ )
+ADD_DEPENDENCIES(${PROJECT_NAME} crash-popup.edj)
+
+INSTALL(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}/crash-popup.edj DESTINATION ${EDJDIR})
+
+# install images
+INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/images/public/ DESTINATION ${IMAGEDIR} FILES_MATCHING PATTERN "*.png")
+
+INSTALL(TARGETS ${EXENAME} DESTINATION ${BINDIR})
+
+# install xml file & icon
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/data/${PKGNAME}.xml DESTINATION ${PREFIX}/share/packages)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/data/${PKGNAME}.png DESTINATION ${ICONDIR})
+# install SMACK rule file
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/org.tizen.crash-popup.rule DESTINATION /opt/etc/smack/accesses.d/)
+# i18n
+ADD_SUBDIRECTORY(popup_po)
+
diff --git a/crash-popup/popup_po/CMakeLists.txt b/crash-popup/popup_po/CMakeLists.txt
new file mode 100644
index 0000000..3573506
--- /dev/null
+++ b/crash-popup/popup_po/CMakeLists.txt
@@ -0,0 +1,24 @@
+# for i18n
+
+SET(POFILES ar.po el_GR.po es_ES.po fi.po gl.po hy.po ka.po lv.po pl.po ru_RU.po sv.po zh_CN.po az.po cs.po en_PH.po es_US.po fr_CA.po hi.po is.po kk.po mk.po pt_BR.po sk.po tr_TR.po zh_HK.po bg.po da.po en.po et.po fr_FR.po hr.po it_IT.po ko_KR.po nb.po pt_PT.po sl.po uk.po zh_SG.po ca.po de_DE.po en_US.po eu.po ga.po hu.po ja_JP.po lt.po nl_NL.po ro.po sr.po uz.po zh_TW.po)
+
+SET(MSGFMT "/usr/bin/msgfmt")
+
+FOREACH(pofile ${POFILES})
+ SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile})
+ MESSAGE("PO: ${pofile}")
+ GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE)
+ GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE)
+ SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo)
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${moFile}
+ COMMAND ${MSGFMT} -o ${moFile} ${absPofile}
+ DEPENDS ${absPofile}
+ )
+ INSTALL(FILES ${moFile}
+ DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo)
+ SET(moFiles ${moFiles} ${moFile})
+ENDFOREACH(pofile)
+
+MESSAGE(".mo files: ${moFiles}")
+ADD_CUSTOM_TARGET(popup_po ALL DEPENDS ${moFiles})
diff --git a/crash-popup/popup_po/ar.po b/crash-popup/popup_po/ar.po
new file mode 100755
index 0000000..ffb8821
--- /dev/null
+++ b/crash-popup/popup_po/ar.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "اغلاق"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "تم إغلاق %s بشكل مفاجئ"
+
diff --git a/crash-popup/popup_po/az.po b/crash-popup/popup_po/az.po
new file mode 100755
index 0000000..262033c
--- /dev/null
+++ b/crash-popup/popup_po/az.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Bağla"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s gözlənilməz şəkildə bağlandı"
+
diff --git a/crash-popup/popup_po/bg.po b/crash-popup/popup_po/bg.po
new file mode 100755
index 0000000..7bb86be
--- /dev/null
+++ b/crash-popup/popup_po/bg.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Затвори"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s се затвори неочаквано"
+
diff --git a/crash-popup/popup_po/ca.po b/crash-popup/popup_po/ca.po
new file mode 100755
index 0000000..5fd5c34
--- /dev/null
+++ b/crash-popup/popup_po/ca.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Tancar"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s s'ha tancat de forma inesperada"
+
diff --git a/crash-popup/popup_po/cs.po b/crash-popup/popup_po/cs.po
new file mode 100755
index 0000000..653ea30
--- /dev/null
+++ b/crash-popup/popup_po/cs.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Zavřít"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s byla neočekávaně ukončena"
+
diff --git a/crash-popup/popup_po/da.po b/crash-popup/popup_po/da.po
new file mode 100755
index 0000000..6150b8b
--- /dev/null
+++ b/crash-popup/popup_po/da.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Luk"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s lukkede uventet"
+
diff --git a/crash-popup/popup_po/de_DE.po b/crash-popup/popup_po/de_DE.po
new file mode 100755
index 0000000..dfc4e9a
--- /dev/null
+++ b/crash-popup/popup_po/de_DE.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Schließen"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s wurde unerwartet geschlossen"
+
diff --git a/crash-popup/popup_po/el_GR.po b/crash-popup/popup_po/el_GR.po
new file mode 100755
index 0000000..e1f3c9e
--- /dev/null
+++ b/crash-popup/popup_po/el_GR.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Κλείσιμο"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "Η εφαρμογή %s έκλεισε με μη αναμενόμενο τρόπο"
+
diff --git a/crash-popup/popup_po/en.po b/crash-popup/popup_po/en.po
new file mode 100755
index 0000000..d8a807d
--- /dev/null
+++ b/crash-popup/popup_po/en.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Close"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s has closed unexpectedly"
+
diff --git a/crash-popup/popup_po/en_PH.po b/crash-popup/popup_po/en_PH.po
new file mode 100755
index 0000000..d8a807d
--- /dev/null
+++ b/crash-popup/popup_po/en_PH.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Close"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s has closed unexpectedly"
+
diff --git a/crash-popup/popup_po/en_US.po b/crash-popup/popup_po/en_US.po
new file mode 100755
index 0000000..d8a807d
--- /dev/null
+++ b/crash-popup/popup_po/en_US.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Close"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s has closed unexpectedly"
+
diff --git a/crash-popup/popup_po/es_ES.po b/crash-popup/popup_po/es_ES.po
new file mode 100755
index 0000000..91e0b0d
--- /dev/null
+++ b/crash-popup/popup_po/es_ES.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Cerrar"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s se ha cerrado de forma inesperada"
+
diff --git a/crash-popup/popup_po/es_US.po b/crash-popup/popup_po/es_US.po
new file mode 100755
index 0000000..0508116
--- /dev/null
+++ b/crash-popup/popup_po/es_US.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Cerrar"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s se cerró inesperadamente"
+
diff --git a/crash-popup/popup_po/et.po b/crash-popup/popup_po/et.po
new file mode 100755
index 0000000..f104118
--- /dev/null
+++ b/crash-popup/popup_po/et.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Sulge"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s on ootamatult suletud"
+
diff --git a/crash-popup/popup_po/eu.po b/crash-popup/popup_po/eu.po
new file mode 100755
index 0000000..897b54c
--- /dev/null
+++ b/crash-popup/popup_po/eu.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Itxi"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s ezustean itxi da"
+
diff --git a/crash-popup/popup_po/fi.po b/crash-popup/popup_po/fi.po
new file mode 100755
index 0000000..2e004b0
--- /dev/null
+++ b/crash-popup/popup_po/fi.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Sulje"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s on yllättäen suljettu"
+
diff --git a/crash-popup/popup_po/fr_CA.po b/crash-popup/popup_po/fr_CA.po
new file mode 100755
index 0000000..db2835d
--- /dev/null
+++ b/crash-popup/popup_po/fr_CA.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Fermer"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s a été fermé de manière inattendue"
+
diff --git a/crash-popup/popup_po/fr_FR.po b/crash-popup/popup_po/fr_FR.po
new file mode 100755
index 0000000..db2835d
--- /dev/null
+++ b/crash-popup/popup_po/fr_FR.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Fermer"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s a été fermé de manière inattendue"
+
diff --git a/crash-popup/popup_po/ga.po b/crash-popup/popup_po/ga.po
new file mode 100755
index 0000000..1e78434
--- /dev/null
+++ b/crash-popup/popup_po/ga.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Dún"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "Dúnadh %s gan choinne"
+
diff --git a/crash-popup/popup_po/gl.po b/crash-popup/popup_po/gl.po
new file mode 100755
index 0000000..f23b184
--- /dev/null
+++ b/crash-popup/popup_po/gl.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Cerrar"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s pechouse inesperadamente"
+
diff --git a/crash-popup/popup_po/hi.po b/crash-popup/popup_po/hi.po
new file mode 100755
index 0000000..234a552
--- /dev/null
+++ b/crash-popup/popup_po/hi.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "बंद करें"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s अनपेक्षित ढंग से बंद हो गया है"
+
diff --git a/crash-popup/popup_po/hr.po b/crash-popup/popup_po/hr.po
new file mode 100755
index 0000000..83f3d90
--- /dev/null
+++ b/crash-popup/popup_po/hr.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Prekid"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s se neočekivano zatvorio"
+
diff --git a/crash-popup/popup_po/hu.po b/crash-popup/popup_po/hu.po
new file mode 100755
index 0000000..09883cc
--- /dev/null
+++ b/crash-popup/popup_po/hu.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Bezárás"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "A(z) %s váratlanul bezáródott"
+
diff --git a/crash-popup/popup_po/hy.po b/crash-popup/popup_po/hy.po
new file mode 100755
index 0000000..191298a
--- /dev/null
+++ b/crash-popup/popup_po/hy.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Փակել"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s-ն անսպասելիորեն փակվել է"
+
diff --git a/crash-popup/popup_po/is.po b/crash-popup/popup_po/is.po
new file mode 100755
index 0000000..2cf1514
--- /dev/null
+++ b/crash-popup/popup_po/is.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Loka"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s var óvænt lokað"
+
diff --git a/crash-popup/popup_po/it_IT.po b/crash-popup/popup_po/it_IT.po
new file mode 100755
index 0000000..049ee48
--- /dev/null
+++ b/crash-popup/popup_po/it_IT.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Chiudi"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "Chiusura improvvisa di %s"
+
diff --git a/crash-popup/popup_po/ja_JP.po b/crash-popup/popup_po/ja_JP.po
new file mode 100755
index 0000000..5c76e2c
--- /dev/null
+++ b/crash-popup/popup_po/ja_JP.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "閉じる"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s​が​予期​せず​終了​しま​した。"
+
diff --git a/crash-popup/popup_po/ka.po b/crash-popup/popup_po/ka.po
new file mode 100755
index 0000000..cacd82f
--- /dev/null
+++ b/crash-popup/popup_po/ka.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "დახურვა"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s მოულოდნელად დაიხურა"
+
diff --git a/crash-popup/popup_po/kk.po b/crash-popup/popup_po/kk.po
new file mode 100755
index 0000000..f786762
--- /dev/null
+++ b/crash-popup/popup_po/kk.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Жабу"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s байқаусызда жабылды"
+
diff --git a/crash-popup/popup_po/ko_KR.po b/crash-popup/popup_po/ko_KR.po
new file mode 100755
index 0000000..0444b85
--- /dev/null
+++ b/crash-popup/popup_po/ko_KR.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "닫기"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s이(가) 비정상적으로 종료되었습니다"
+
diff --git a/crash-popup/popup_po/lt.po b/crash-popup/popup_po/lt.po
new file mode 100755
index 0000000..07cbb58
--- /dev/null
+++ b/crash-popup/popup_po/lt.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Uždaryti"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "„%s“ netikėtai užsidarė"
+
diff --git a/crash-popup/popup_po/lv.po b/crash-popup/popup_po/lv.po
new file mode 100755
index 0000000..b050a30
--- /dev/null
+++ b/crash-popup/popup_po/lv.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Aizvērt"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "Programma %s tika negaidīti aizvērta"
+
diff --git a/crash-popup/popup_po/mk.po b/crash-popup/popup_po/mk.po
new file mode 100755
index 0000000..59092db
--- /dev/null
+++ b/crash-popup/popup_po/mk.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Затвори"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s неочекувано затвори"
+
diff --git a/crash-popup/popup_po/nb.po b/crash-popup/popup_po/nb.po
new file mode 100755
index 0000000..7e15d5c
--- /dev/null
+++ b/crash-popup/popup_po/nb.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Lukk"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s har uventet lukket"
+
diff --git a/crash-popup/popup_po/nl_NL.po b/crash-popup/popup_po/nl_NL.po
new file mode 100755
index 0000000..229d0d4
--- /dev/null
+++ b/crash-popup/popup_po/nl_NL.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Sluiten"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s is onverwacht gesloten"
+
diff --git a/crash-popup/popup_po/pl.po b/crash-popup/popup_po/pl.po
new file mode 100755
index 0000000..6c61454
--- /dev/null
+++ b/crash-popup/popup_po/pl.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Zamknij"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "Aplikacja %s została niespodziewanie zamknięta"
+
diff --git a/crash-popup/popup_po/pt_BR.po b/crash-popup/popup_po/pt_BR.po
new file mode 100755
index 0000000..93bda30
--- /dev/null
+++ b/crash-popup/popup_po/pt_BR.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Fechar"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s fechou de forma inesperada"
+
diff --git a/crash-popup/popup_po/pt_PT.po b/crash-popup/popup_po/pt_PT.po
new file mode 100755
index 0000000..8210630
--- /dev/null
+++ b/crash-popup/popup_po/pt_PT.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Fechar"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s foi encerrado inesperadamente"
+
diff --git a/crash-popup/popup_po/ro.po b/crash-popup/popup_po/ro.po
new file mode 100755
index 0000000..8502281
--- /dev/null
+++ b/crash-popup/popup_po/ro.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Închide"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s s-a închis în mod neaşteptat"
+
diff --git a/crash-popup/popup_po/ru_RU.po b/crash-popup/popup_po/ru_RU.po
new file mode 100755
index 0000000..8f0b820
--- /dev/null
+++ b/crash-popup/popup_po/ru_RU.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Закрыть"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "Приложение %s неожиданно закрылось"
+
diff --git a/crash-popup/popup_po/sk.po b/crash-popup/popup_po/sk.po
new file mode 100755
index 0000000..9d24d9b
--- /dev/null
+++ b/crash-popup/popup_po/sk.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Zavrieť"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "Aplikácia %s sa neočakávane ukončila"
+
diff --git a/crash-popup/popup_po/sl.po b/crash-popup/popup_po/sl.po
new file mode 100755
index 0000000..d3fa670
--- /dev/null
+++ b/crash-popup/popup_po/sl.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Zapri"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "Program %s se je nepričakovano zaprl"
+
diff --git a/crash-popup/popup_po/sr.po b/crash-popup/popup_po/sr.po
new file mode 100755
index 0000000..c05e8af
--- /dev/null
+++ b/crash-popup/popup_po/sr.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Zatvori"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "Aplikacija %s se neočekivano zatvorila"
+
diff --git a/crash-popup/popup_po/sv.po b/crash-popup/popup_po/sv.po
new file mode 100755
index 0000000..0ab907e
--- /dev/null
+++ b/crash-popup/popup_po/sv.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Stäng"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s stängdes oväntat"
+
diff --git a/crash-popup/popup_po/tr_TR.po b/crash-popup/popup_po/tr_TR.po
new file mode 100755
index 0000000..d6095ae
--- /dev/null
+++ b/crash-popup/popup_po/tr_TR.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Kapat"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s beklenmedik şekilde kapandı"
+
diff --git a/crash-popup/popup_po/uk.po b/crash-popup/popup_po/uk.po
new file mode 100755
index 0000000..52ff0f9
--- /dev/null
+++ b/crash-popup/popup_po/uk.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Закрити"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s неочікувано припинила свою роботу"
+
diff --git a/crash-popup/popup_po/uz.po b/crash-popup/popup_po/uz.po
new file mode 100755
index 0000000..d6c3858
--- /dev/null
+++ b/crash-popup/popup_po/uz.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "Yopish"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s kutimaganda yopildi"
+
diff --git a/crash-popup/popup_po/zh_CN.po b/crash-popup/popup_po/zh_CN.po
new file mode 100755
index 0000000..15fcc44
--- /dev/null
+++ b/crash-popup/popup_po/zh_CN.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "关闭"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s 已意外关闭"
+
diff --git a/crash-popup/popup_po/zh_HK.po b/crash-popup/popup_po/zh_HK.po
new file mode 100755
index 0000000..279c48a
--- /dev/null
+++ b/crash-popup/popup_po/zh_HK.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "關閉"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s 已意外關閉"
+
diff --git a/crash-popup/popup_po/zh_SG.po b/crash-popup/popup_po/zh_SG.po
new file mode 100755
index 0000000..15fcc44
--- /dev/null
+++ b/crash-popup/popup_po/zh_SG.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "关闭"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s 已意外关闭"
+
diff --git a/crash-popup/popup_po/zh_TW.po b/crash-popup/popup_po/zh_TW.po
new file mode 100755
index 0000000..279c48a
--- /dev/null
+++ b/crash-popup/popup_po/zh_TW.po
@@ -0,0 +1,6 @@
+msgid "IDS_COM_BUTTON_CLOSE"
+msgstr "關閉"
+
+msgid "IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"
+msgstr "%s 已意外關閉"
+
diff --git a/crash-popup/src/crash-popup.c b/crash-popup/src/crash-popup.c
new file mode 100644
index 0000000..a34a1e6
--- /dev/null
+++ b/crash-popup/src/crash-popup.c
@@ -0,0 +1,405 @@
+/*
+ * CRASH-POPUP
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 <errno.h>
+#include <appcore-efl.h>
+#include <Elementary.h>
+#include <Ecore_X.h>
+#include <utilX.h>
+#include <vconf.h>
+#include <locale.h>
+#include <unistd.h>
+#include <grp.h>
+#include <X11/Xlib.h>
+#include <ail.h>
+
+#include "util_log.h"
+#include "crash-popup.h"
+
+#define KEY_ESC_ON_KEYBOARD "Escape"
+
+static char *appname[256];
+
+/**
+ * callback function of ECORE_EVENT_KEY_DOWN
+ */
+static Eina_Bool _ecore_event_key_down_cb(void *data, int type, void *event_info)
+{
+ Ecore_Event_Key * kd = (Ecore_Event_Key *) event_info;
+
+ _D("%s key pressed", kd->keyname);
+
+ if (0 == strcmp(kd->keyname, KEY_HOME)
+ || 0 == strcmp(kd->keyname, KEY_ESC_ON_KEYBOARD)
+ || 0 == strcmp(kd->keyname, KEY_BACK)) {
+ elm_exit();
+ return EINA_FALSE;
+ }
+
+ return EINA_TRUE;
+}
+static void _keygrab(void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+ /* Key Grab */
+ Evas *evas = evas_object_evas_get(ad->win);
+ ad->main_xid = (Ecore_X_Window)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas));
+ ad->x_disp = ecore_x_display_get();
+ if (ad->x_disp == NULL)
+ _E("Failed to get X display");
+ if (utilx_grab_key(ad->x_disp, ad->main_xid, KEY_HOME, TOP_POSITION_GRAB) == -1)
+ _E("Grabbing KEY_HOME key is failed");
+ else
+ _D("Grabbing KEY_HOME key is successful");
+}
+static void _keyungrab(void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+
+ utilx_ungrab_key(ad->x_disp, ad->main_xid, KEY_HOME);
+ _D("Ungrabbing KEY_HOME key is successful");
+}
+
+static int rotate(enum appcore_rm m, void *data)
+{
+ struct appdata *ad = data;
+ int r;
+
+ if (ad == NULL || ad->win == NULL)
+ return 0;
+ switch (m) {
+ case APPCORE_RM_PORTRAIT_NORMAL:
+ r = 0;
+ break;
+ case APPCORE_RM_PORTRAIT_REVERSE:
+ r = 180;
+ break;
+ case APPCORE_RM_LANDSCAPE_NORMAL:
+ r = 270;
+ break;
+ case APPCORE_RM_LANDSCAPE_REVERSE:
+ r = 90;
+ break;
+ default:
+ r = -1;
+ break;
+ }
+ if (r >= 0)
+ elm_win_rotation_with_resize_set(ad->win, r);
+ return 0;
+}
+static void popup_close_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+
+ retm_if(ad == NULL, "Invalid argument:appdata is NULL\n");
+ _D("wait timer stopped\n");
+ if (ad->et) {
+ ecore_timer_del(ad->et);
+ ad->et = NULL;
+ }
+ if (ad->win) {
+ evas_object_del(ad->win);
+ ad->win = NULL;
+ }
+ elm_shutdown();
+ elm_exit();
+}
+
+static ail_cb_ret_e appinfo_get_name_func(const ail_appinfo_h appinfo, void *user_data)
+{
+ char *str;
+ ail_cb_ret_e ret = AIL_CB_RET_CONTINUE;
+
+ ret = ail_appinfo_get_str(appinfo, AIL_PROP_NAME_STR, &str);
+ if (str) {
+ snprintf(appname, sizeof(appname), "%s", str);
+ ret = AIL_CB_RET_CANCEL;
+ }
+
+ return ret;
+}
+
+static int get_appname_by_exepath(const char *exepath)
+{
+ ail_filter_h f;
+ ail_error_e ret;
+ int count, r;
+
+ if (!exepath)
+ return -EINVAL;
+
+ ret = ail_filter_new(&f);
+ if (ret != AIL_ERROR_OK) {
+ _E("FAIL: ail_filter_new()");
+ return -EINVAL;
+ }
+
+ ret = ail_filter_add_str(f, AIL_PROP_EXEC_STR, exepath);
+ if (ret != AIL_ERROR_OK) {
+ _E("FAIL: ail_filter_add_str()");
+ r = -EINVAL;
+ goto out;
+ }
+
+ ret = ail_filter_count_appinfo(f, &count);
+ if (ret != AIL_ERROR_OK) {
+ _E("FAIL: ail_filter_count_appinfo()");
+ r = -EINVAL;
+ goto out;
+ }
+
+ if (count < 1) {
+ _E("There is no app matching to the exepath");
+ r = -EINVAL;
+ goto out;
+ }
+
+ ret = ail_filter_list_appinfo_foreach(f, appinfo_get_name_func, NULL);
+ if (ret != AIL_ERROR_OK) {
+ _E("FAIL: ail_filter_list_appinfo_foreach()");
+ r = -EINVAL;
+ goto out;
+ }
+
+ r = 0;
+
+out:
+ ail_filter_destroy(f);
+ return r;
+}
+
+static void add_sorry_popup(struct appdata *ad)
+{
+ Evas_Object *pu, *bt1;
+ char buf[512] = {0, };
+ char *name;
+ int ret;
+
+ ret = get_appname_by_exepath(ad->exepath);
+ if (ret < 0)
+ name = ad->appname;
+ else
+ name = appname;
+
+ snprintf(buf, sizeof(buf),
+ _("IDS_ST_BODY_PS_HAS_CLOSED_UNEXPECTEDLY"), name);
+ pu = elm_popup_add(ad->win);
+ elm_object_text_set(pu, buf);
+ bt1 = elm_button_add(pu);
+ snprintf(buf, sizeof(buf), "%s", _("IDS_COM_BUTTON_CLOSE"));
+ elm_object_text_set(bt1, buf);
+ elm_object_style_set(bt1, "popup");
+ elm_object_part_content_set(pu, "button1", bt1);
+ evas_object_smart_callback_add(bt1, "clicked", popup_close_cb, ad);
+ evas_object_show(pu);
+}
+
+Evas_Object *add_main_window(const char *name, Evas_Coord *w, Evas_Coord *h)
+{
+ Evas_Object *eo;
+
+ eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
+ if (eo) {
+ elm_win_title_set(eo, name);
+ elm_win_borderless_set(eo, EINA_TRUE);
+ ecore_x_window_size_get(ecore_x_window_root_first_get(), w, h);
+ evas_object_resize(eo, *w, *h);
+ }
+ return eo;
+}
+
+Eina_Bool wait_timer_cb(void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+
+ retvm_if(ad == NULL, 0, "Invalid argument: appdata is NULL\n");
+ if (ad->et) {
+ ecore_timer_del(ad->et);
+ ad->et = NULL;
+ }
+ if (ad->win) {
+ evas_object_del(ad->win);
+ ad->win = NULL;
+ }
+ elm_shutdown();
+ elm_exit();
+ return ECORE_CALLBACK_CANCEL;
+}
+static int crash_popup(struct appdata *ad)
+{
+ int ret, val;
+ int state = 0;
+ Evas_Object *win;
+ Evas_Coord w, h;
+ Ecore_X_Atom effect_state_atom;
+ retvm_if(ad == NULL, -1, "Invalid argument: appdata is NULL\n");
+ win = add_main_window(PACKAGE, &w, &h);
+ retvm_if(win == NULL, -1, "Failed to create window\n");
+ elm_win_alpha_set(win, EINA_TRUE);
+ evas_object_show(win);
+ ad->win = win;
+ elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW);
+ /* disable window effect */
+ effect_state_atom = ecore_x_atom_get("_NET_CM_WINDOW_EFFECT_ENABLE");
+ _D("window effect is (%d)\n", effect_state_atom);
+ ecore_x_window_prop_property_set(elm_win_xwindow_get(win),
+ effect_state_atom, ECORE_X_ATOM_CARDINAL, 32, &state, 1);
+ /* start popup */
+ add_sorry_popup(ad);
+ if (ad->et) {
+ ecore_timer_del(ad->et);
+ ad->et = NULL;
+ }
+ if (!strcmp(ad->appname, "modem"))
+ return 0;
+ ret = vconf_get_int(VCONFKEY_CRASH_AUTOCLOSE, &val);
+ if (val == 1)
+ ad->et = ecore_timer_add(5.0, wait_timer_cb, ad);
+ return 0;
+}
+static int app_create(void *data)
+{
+ struct appdata *ad = data;
+ int ret, val;
+
+ retvm_if(ad == NULL, -1, "Invalid argument: appdata is NULL\n");
+
+ elm_init(0, NULL);
+ /* add system event callback */
+ appcore_set_rotation_cb(rotate, ad);
+ appcore_set_i18n("crash-popup", LOCALEDIR);
+ /* appcore measure time example */
+ _D("from AUL to %s(): %d msec\n", __func__,
+ appcore_measure_time_from("APP_START_TIME"));
+ appcore_measure_start();
+ ret = vconf_get_int(VCONFKEY_CRASH_POPUP, &val);
+ /* val 1 means showing popup */
+ if (val == 1) {
+ crash_popup(ad);
+ ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
+ _ecore_event_key_down_cb, ad);
+ _keygrab(ad);
+ } else {
+ elm_shutdown();
+ elm_exit();
+ }
+ return 0;
+}
+static int app_terminate(void *data)
+{
+ struct appdata *ad = data;
+
+ if (ad->et) {
+ ecore_timer_del(ad->et);
+ ad->et = NULL;
+ }
+ if (ad->win)
+ evas_object_del(ad->win);
+
+ _keyungrab(ad);
+ _D("from create to %s(): %d msec\n", __func__, appcore_measure_time());
+ return 0;
+}
+static int app_pause(void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+
+ retvm_if(ad == NULL, -1, "Invalid argument:appdata is NULL\n");
+ if (ad->win)
+ elm_win_activate(ad->win);
+ return 0;
+}
+static int app_resume(void *data)
+{
+ return 0;
+}
+static int app_reset(bundle *b, void *data)
+{
+ struct appdata *ad = data;
+ int ret, state;
+
+ /* appcore measure time example */
+ _D("from AUL to %s(): %d msec\n", __func__,
+ appcore_measure_time_from("APP_START_TIME"));
+ _D("from create to %s(): %d msec\n", __func__,
+ appcore_measure_time());
+ if (ad->win)
+ elm_win_activate(ad->win);
+
+ ret = appcore_get_rotation_state(&state);
+ if (ret == 0) {
+ _D("rotate state: %d", state);
+ ret = rotate(state, ad);
+ if (ret != 0)
+ _E("FAIL: rotate()");
+ }
+
+ return 0;
+}
+int main(int argc, char *argv[])
+{
+ int i = 0;
+ struct group *ge;
+ struct passwd *pw;
+ struct appdata ad;
+ struct appcore_ops ops = {
+ .create = app_create,
+ .terminate = app_terminate,
+ .pause = app_pause,
+ .resume = app_resume,
+ .reset = app_reset,
+ };
+
+ setenv("HOME", "/home/app", 1);
+ ge = getgrnam("app");
+ if (ge != NULL) {
+ setgid(ge->gr_gid);
+ if (initgroups("app", ge->gr_gid) < 0)
+ _E("failed to init\n");
+ }
+ pw = getpwnam("app");
+ if (pw != NULL)
+ setuid(pw->pw_uid);
+
+ _D("argc(%d)\n", argc);
+ if (argc < 3) {
+ _D("argc is (%d) wrong argument\n", argc);
+ return -1;
+ }
+ for (i = 0; i < argc; i++) {
+ if (argv[i]) {
+ _D("%d, %s\n", i+1, argv[i]);
+ } else {
+ _E("%d argument is NULL\n", i+1);
+ return -1;
+ }
+ }
+ if (ecore_x_init(NULL) == NULL) {
+ _E("Cannot connect to X11 display\n");
+ return -1;
+ }
+ /* appcore measure time example */
+ _D("from AUL to %s(): %d msec\n", __func__,
+ appcore_measure_time_from("APP_START_TIME"));
+ memset(&ad, 0x0, sizeof(struct appdata));
+ snprintf(ad.appname, sizeof(ad.appname), "%s", argv[1]);
+ snprintf(ad.exepath, sizeof(ad.exepath), "%s", argv[2]);
+ ops.data = &ad;
+ return appcore_efl_main(PACKAGE, &argc, &argv, &ops);
+}
diff --git a/crash-popup/src/crash-popup.h b/crash-popup/src/crash-popup.h
new file mode 100644
index 0000000..67c4c52
--- /dev/null
+++ b/crash-popup/src/crash-popup.h
@@ -0,0 +1,73 @@
+/*
+ * CRASH-POPUP
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+
+#ifndef __CRASH_POPUP_H__
+#define __CRASH_POPUP_H__
+
+#include <Elementary.h>
+#include <Ecore_X.h>
+
+#if !defined(PACKAGE)
+# define PACKAGE "crash-popup"
+#endif
+
+#if !defined(RESDIR)
+# define RESDIR "/usr/apps/org.tizen.crash-popup/res"
+#endif
+
+#if !defined(LOCALEDIR)
+# define LOCALEDIR RESDIR"/locale"
+#endif
+
+#if !defined(EDJDIR)
+# define EDJDIR RESDIR"/edje"
+#endif
+
+#define EDJ_FILE EDJDIR "/" PACKAGE ".edj"
+#define GRP_MAIN "main"
+
+#ifndef _
+#define _(str) gettext(str)
+#endif
+
+#ifndef gettext_noop
+#define gettext_noop(str) (str)
+#endif
+
+#ifndef N_
+#define N_(str) gettext_noop(str)
+#endif
+
+#ifndef __VCONF_INTERNAL_CRASH_KEYS_H__
+#define VCONFKEY_CRASH_POPUP "db/crash/popup"
+#define VCONFKEY_CRASH_AUTOCLOSE "db/crash/autoclose"
+#endif
+
+struct appdata
+{
+ Evas *evas;
+ Evas_Object *win, *en;
+ Ecore_X_Window main_xid;
+ Ecore_X_Display *x_disp;
+ Ecore_Timer *et;
+ char appname[256];
+ char exepath[256];
+ /* add more variables here */
+};
+
+#endif
+/* __CRASH_POPUP_H__ */
diff --git a/crash-popup/src/util_log.h b/crash-popup/src/util_log.h
new file mode 100644
index 0000000..f03ecf6
--- /dev/null
+++ b/crash-popup/src/util_log.h
@@ -0,0 +1,64 @@
+/*
+ * CRASH-POPUP
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+
+
+
+#ifndef __CRASH_POP_UTIL_LOG_H__
+#define __CRASH_POP_UTIL_LOG_H__
+
+#include <unistd.h>
+#include <dlog.h>
+
+#undef LOG_TAG
+#define LOG_TAG "CRASH_POPUP"
+#define _E(fmt, arg...) LOGE(fmt, ##arg)
+#define _D(fmt, arg...) LOGD(fmt, ##arg)
+
+#define retvm_if(expr, val, fmt, arg...) do { \
+ if(expr) { \
+ _E(fmt, ##arg); \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+} while (0)
+
+#define retv_if(expr, val) do { \
+ if(expr) { \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+} while (0)
+
+#define retm_if(expr, fmt, arg...) do { \
+ if(expr) { \
+ _E(fmt, ##arg); \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+} while (0)
+
+#define ret_if(expr) do { \
+ if(expr) { \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+} while (0)
+
+
+#endif
+/* __CRASH_POP_UTIL_LOG_H__ */
+
diff --git a/crash-worker/CMakeLists.txt b/crash-worker/CMakeLists.txt
new file mode 100644
index 0000000..da265cf
--- /dev/null
+++ b/crash-worker/CMakeLists.txt
@@ -0,0 +1,62 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(crash-worker C)
+
+SET(SRCS
+ util.c
+ crash-worker.c
+)
+
+IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+ SET(CMAKE_BUILD_TYPE "Release")
+ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs REQUIRED
+ appcore-efl
+ elementary
+ ecore-file
+ ecore-input
+ ecore-x
+ ecore
+ evas
+ edje
+ vconf
+ utilX
+ ecore-imf
+ appcore-common
+ ecore-imf
+ ail
+ capi-system-info
+)
+
+FOREACH(flag ${pkgs_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
+SET(CMAKE_C_FLAGS_RELEASE "-O2")
+
+FIND_PROGRAM(UNAME NAMES uname)
+EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
+IF("${ARCH}" STREQUAL "arm")
+ ADD_DEFINITIONS("-DTARGET")
+ MESSAGE("add -DTARGET")
+ENDIF("${ARCH}" STREQUAL "arm")
+
+ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
+IF("${DEBUG_LOG_ON}" STREQUAL "")
+ ADD_DEFINITIONS("-DDEBUG_LOG_ON=\"${DEBUG_LOG_ON}\"")
+ MESSAGE("add -DDEBUG_LOG_ON")
+ENDIF("${DEBUG_LOG_ON}" STREQUAL "")
+#SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed")
+SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed")
+
+ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS})
+
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
diff --git a/crash-worker/crash-worker.c b/crash-worker/crash-worker.c
new file mode 100644
index 0000000..e88622c
--- /dev/null
+++ b/crash-worker/crash-worker.c
@@ -0,0 +1,1158 @@
+/*
+ * CRASH-WORKER
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/statfs.h>
+#include <sys/types.h>
+#include <sys/mount.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <ail.h>
+#include <vconf.h>
+#include <system_info.h>
+
+#include "crash-worker.h"
+#include "util.h"
+
+#define CLEAR_DUMP_PATH 1
+#define BUF_SIZE 1024
+#define DM_BUF_SIZE (1024 * 10 * 2)
+/* This is rule for what is gathering in system */
+static cw_gather_log_rule g_crule[] = {
+ {CW_GATHER_DLOG, 1, "cp /opt/var/log/dlog* ", "/"},
+ {CW_GATHER_PS, 0, "ps -aux > ", "/ps.log"},
+ {CW_GATHER_MEMPS, 0, "memps -a > ", "/memps.log"},
+ {CW_GATHER_TOP, 0, "top -bc -n 1 > ", "/top.log"},
+ {CW_GATHER_CP, 0, "cp /opt/etc/modem/err/* ", "/"},
+ {CW_GATHER_SS, 0, "screenshot bmp ", "/slp_screenshot.bmp"},
+ {CW_GATHER_KL, 1, "cp /opt/var/log/messages ", "/"},
+ {CW_GATHER_RL, 1, "cp /opt/var/log/seq.radio.log ", "/"},
+ {CW_GATHER_XL, 1, "cp /opt/var/log/*Xorg.* ", "/"},
+ {CW_GATHER_MAX, 0, "", ""},
+};
+/* check disk available size */
+static int _check_disk_available(char *mount_dir, int check_size)
+{
+ struct statfs lstatfs;
+ int avail_size = 0;
+
+ if (mount_dir == NULL)
+ return -1;
+ if (check_size == 0)
+ return 1;
+ if (statfs(mount_dir, &lstatfs) < 0) {
+ LOGWARN("can't get statfs %s\n", mount_dir);
+ return -1;
+ }
+ avail_size = (int)(lstatfs.f_bavail * (lstatfs.f_bsize/1024));
+ if (check_size > avail_size) {
+ LOGINFO("NO %d < %d\n", check_size, avail_size);
+ return -1;
+ }
+ LOGINFO("disk availiable!(%d)\n", avail_size);
+ return 1;
+}
+/* check directory access */
+static int _check_dir_access(const char *path)
+{
+ if (access(path, F_OK) != 0)
+ return -1;
+ else
+ return 1;
+}
+/* make directory after check directory access */
+static int _make_dir(char *path)
+{
+ if (access(path, F_OK) == -1) {
+ /* make dir for cs file */
+ if (mkdir(path, DIR_PERMS) < 0) {
+ LOGWARN("can't make dir : %s\n", path);
+ return -1;
+ } else
+ return 1;
+ } else
+ return 1;
+}
+/* sort function by time order for fill file list */
+static int _dump_mtime_sort(const void *va, const void *vb)
+{
+ struct dirent *d1, *d2;
+ struct stat st1, st2;
+ char fbuf1[NAME_MAX] = {0, };
+ char fbuf2[NAME_MAX] = {0, };
+
+ d1 = *(struct dirent **)(va);
+ d2 = *(struct dirent **)(vb);
+ snprintf(fbuf1, sizeof(fbuf1), "%s/%s", CRASH_DUMP_PATH, d1->d_name);
+ if (stat(fbuf1, &st1) == -1) {
+ LOGERR("can't get stat %s errno(%d)\n", fbuf1, errno);
+ return 0;
+ }
+ snprintf(fbuf2, sizeof(fbuf2), "%s/%s", CRASH_DUMP_PATH, d2->d_name);
+ if (stat(fbuf2, &st2) == -1) {
+ LOGERR("can't get stat %s errno(%d)\n", fbuf2, errno);
+ return 0;
+ }
+ return st1.st_mtime - st2.st_mtime;
+}
+/* sort function by time order for fill file list */
+static int _report_mtime_sort(const void *va, const void *vb)
+{
+ struct dirent *d1, *d2;
+ struct stat st1, st2;
+ char fbuf1[NAME_MAX] = {0, };
+ char fbuf2[NAME_MAX] = {0, };
+
+ d1 = *(struct dirent **)(va);
+ d2 = *(struct dirent **)(vb);
+ snprintf(fbuf1, sizeof(fbuf1), "%s/%s", CRASH_REPORT_PATH, d1->d_name);
+ if (stat(fbuf1, &st1) == -1) {
+ LOGERR("can't get stat %s errno(%d)\n", fbuf1, errno);
+ return 0;
+ }
+ snprintf(fbuf2, sizeof(fbuf2), "%s/%s", CRASH_REPORT_PATH, d2->d_name);
+ if (stat(fbuf2, &st2) == -1) {
+ LOGERR("can't get stat %s errno(%d)\n", fbuf2, errno);
+ return 0;
+ }
+ return st1.st_mtime - st2.st_mtime;
+}
+/* sort function by time order for fill file list */
+static int _ticket_mtime_sort(const void *va, const void *vb)
+{
+ struct dirent *d1, *d2;
+ struct stat st1, st2;
+ char fbuf1[NAME_MAX] = {0, };
+ char fbuf2[NAME_MAX] = {0, };
+
+ d1 = *(struct dirent **)(va);
+ d2 = *(struct dirent **)(vb);
+ snprintf(fbuf1, sizeof(fbuf1), "%s/%s", CRASH_TICKET_PATH, d1->d_name);
+ if (stat(fbuf1, &st1) == -1) {
+ LOGERR("can't get stat %s errno(%d)\n", fbuf1, errno);
+ return 0;
+ }
+ snprintf(fbuf2, sizeof(fbuf2), "%s/%s", CRASH_TICKET_PATH, d2->d_name);
+ if (stat(fbuf2, &st2) == -1) {
+ LOGERR("can't get stat %s errno(%d)\n", fbuf2, errno);
+ return 0;
+ }
+ return st1.st_mtime - st2.st_mtime;
+}
+/* filter for count previous report file */
+static int _dump_filter(const struct dirent *dirent)
+{
+ if (!(strncmp(dirent->d_name, ".", 1)) ||
+ !(strcmp(dirent->d_name, ".."))) {
+ return 0;
+ } else {
+ if (dirent->d_type == DT_DIR)
+ return 0;
+ char *gz = strrchr(dirent->d_name, '.');
+ if (gz == NULL)
+ return 0;
+ if (!strncmp(gz, ".gz", 3))
+ return 1;
+ return 0;
+ }
+}
+/* filter for count previous report file */
+static int _report_filter(const struct dirent *dirent)
+{
+ if (!(strncmp(dirent->d_name, ".", 1)) ||
+ !(strcmp(dirent->d_name, ".."))) {
+ return 0;
+ } else {
+ if (dirent->d_type == DT_DIR)
+ return 0;
+ char *gz = strrchr(dirent->d_name, '.');
+ if (gz == NULL)
+ return 0;
+ if (!strncmp(gz, ".cs", 3))
+ return 1;
+ return 0;
+ }
+}
+/* filter for count previous ticket file */
+static int _ticket_filter(const struct dirent *dirent)
+{
+ if (!(strncmp(dirent->d_name, ".", 1)) ||
+ !(strcmp(dirent->d_name, ".."))) {
+ return 0;
+ } else {
+ if (dirent->d_type == DT_DIR)
+ return 0;
+ char *gz = strrchr(dirent->d_name, '.');
+ if (gz == NULL)
+ return 0;
+ if (!strncmp(gz, ".ct", 3))
+ return 1;
+ return 0;
+ }
+}
+/* count previous dump file */
+static int _count_pre_dump(struct dirent ***filelist)
+{
+ int ret = 0;
+
+ if (filelist == NULL)
+ return -1;
+ ret = scandir(CRASH_DUMP_PATH, filelist, _dump_filter, (int (*)(const struct dirent **, const struct dirent **))_dump_mtime_sort);
+ if (ret < 0) {
+ LOGERR("scandir error\n");
+ return -1;
+ }
+ return ret;
+}
+/* count previous report file */
+static int _count_pre_report(struct dirent ***filelist)
+{
+ int ret = 0;
+
+ if (filelist == NULL)
+ return -1;
+ ret = scandir(CRASH_REPORT_PATH, filelist, _report_filter, (int (*)(const struct dirent **, const struct dirent **))_report_mtime_sort);
+ if (ret < 0) {
+ LOGERR("scandir error\n");
+ return -1;
+ }
+ return ret;
+}
+/* count previous ticket file */
+static int _count_pre_ticket(struct dirent ***filelist)
+{
+ int ret = 0;
+
+ if (filelist == NULL)
+ return -1;
+ ret = scandir(CRASH_TICKET_PATH, filelist, _ticket_filter, (int (*)(const struct dirent **, const struct dirent **))_ticket_mtime_sort);
+ if (ret < 0) {
+ LOGERR("scandir error\n");
+ return -1;
+ }
+ return ret;
+}
+static int _del_ticket_contents(char *ticketname)
+{
+ char path[PATH_LEN] = {0,};
+ char buf[NAME_MAX] = {0,};
+ char fbuf[NAME_MAX] = {0,};
+ int ret = 0;
+ struct stat fstat;
+ FILE *fp;
+
+ if (ticketname == NULL)
+ return -1;
+ snprintf(path, sizeof(path), "%s/%s", CRASH_TICKET_PATH, ticketname);
+ ret = access(path, F_OK);
+ if (ret == 0) {
+ fp = fopen(path, "rb");
+ if (fp == NULL) {
+ LOGERR("crash ticket open error\n");
+ return -1;
+ }
+ fseek(fp, 0, SEEK_SET);
+ while (fgets(buf, sizeof(buf), fp)) {
+ char *p = strchr(buf, '\n');
+ if (p)
+ *p = '\0';
+ snprintf(fbuf, sizeof(fbuf), "%s", buf);
+ ret = access(fbuf, F_OK);
+ if (ret == 0) {
+ if (lstat(fbuf, &fstat) < 0)
+ continue;
+ if (S_ISDIR(fstat.st_mode)) {
+ if (delete_dir_contents(fbuf, 1, NULL) < 0) {
+ LOGERR("can't delete path crash dir(%s)", fbuf);
+ continue;
+ }
+ } else {
+ if (unlink(fbuf) < 0) {
+ LOGERR("can't delete crash file (%s)", fbuf);
+ continue;
+ }
+ }
+ LOGDEBUG("delete is (%s)", fbuf);
+ }
+ }
+ fclose(fp);
+ unlink(path);/*delete ticket*/
+ return 1;
+ } else
+ return -1;
+}
+/* delete previous ticket and dump file */
+static void _delete_pre_ticket(struct dirent **filelist, int del_num)
+{
+ int i = 0;
+
+ for (i = 0; i < del_num + 1; i++) {
+ if (_del_ticket_contents(filelist[i]->d_name) != 1)
+ LOGERR("can't delete ticket and contents(%s)\n",
+ filelist[i]->d_name);
+ else
+ LOGINFO("delete ticket and contents(%s)\n",
+ filelist[i]->d_name);
+ }
+}
+/* delete previous dump file */
+static void _delete_pre_dump(struct dirent **filelist, int del_num)
+{
+ int i = 0;
+ char fbuf[PATH_LEN] = {0, }; /* file buff */
+
+ for (i = 0; i < del_num + 1; i++) {
+ snprintf(fbuf, sizeof(fbuf),
+ "%s/%s", CRASH_DUMP_PATH,
+ filelist[i]->d_name);
+ if (unlink(fbuf) < 0)
+ LOGERR("can't unlink (%s)\n", fbuf);
+ else
+ LOGINFO("unlink(%s)\n", fbuf);
+ }
+}
+/* delete previous report file */
+static void _delete_pre_report(struct dirent **filelist, int del_num)
+{
+ int i = 0;
+ char fbuf[PATH_LEN] = {0, }; /* file buff */
+
+ for (i = 0; i < del_num + 1; i++) {
+ snprintf(fbuf, sizeof(fbuf),
+ "%s/%s", CRASH_REPORT_PATH,
+ filelist[i]->d_name);
+ if (unlink(fbuf) < 0)
+ LOGERR("can't unlink (%s)\n", fbuf);
+ else
+ LOGINFO("unlink(%s)\n", fbuf);
+ }
+}
+/* free dirent list */
+static int _free_filelist(struct dirent **filelist, int list_num)
+{
+ int i = 0;
+
+ if (filelist == NULL || list_num == 0)
+ return -1;
+ for (i = 0; i < list_num; i++) {
+ if (filelist[i])
+ free(filelist[i]);
+ }
+ free(filelist);
+ return 1;
+}
+/* ail filter list function for getting package information */
+static ail_cb_ret_e appinfo_list_func(const ail_appinfo_h appinfo, void *user_data)
+{
+ char *str;
+ FILE *fp = (FILE *)user_data;
+
+ ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &str);
+ fprintf(fp, "Package Name: %s\n", str);
+ ail_appinfo_get_str(appinfo, AIL_PROP_X_SLP_PKGID_STR, &str);
+ fprintf(fp, "Package ID : %s\n", str);
+ ail_appinfo_get_str(appinfo, AIL_PROP_VERSION_STR, &str);
+ fprintf(fp, "Version: %s\n", str);
+ ail_appinfo_get_str(appinfo, AIL_PROP_X_SLP_PACKAGETYPE_STR, &str);
+ fprintf(fp, "Package Type: %s\n", str);
+ ail_appinfo_get_str(appinfo, AIL_PROP_NAME_STR, &str);
+ fprintf(fp, "App Name: %s\n", str);
+ ail_appinfo_get_str(appinfo, AIL_PROP_X_SLP_APPID_STR, &str);
+ fprintf(fp, "App ID: %s\n", str);
+ ail_appinfo_get_str(appinfo, AIL_PROP_TYPE_STR, &str);
+ fprintf(fp, "Type: %s\n", str);
+ ail_appinfo_get_str(appinfo, AIL_PROP_CATEGORIES_STR, &str);
+ fprintf(fp, "Categories: %s\n", str);
+ return AIL_CB_RET_CONTINUE;
+}
+/* ail filter list function for getting application ID */
+static ail_cb_ret_e appinfo_get_appid_func(const ail_appinfo_h appinfo,
+ void *user_data)
+{
+ char *str;
+
+ if (user_data == NULL)
+ return AIL_ERROR_FAIL;
+ ail_error_e ret = AIL_ERROR_OK;
+ ret = ail_appinfo_get_str(appinfo, AIL_PROP_X_SLP_APPID_STR, &str);
+ strncpy((char *)user_data, str, strlen(str));
+ return ret;
+}
+/* get application ID by ail filter */
+static int _get_app_id(char *exepath, char *app_id)
+{
+ ail_filter_h f;
+ int count = 0;
+ int ret = 0;
+
+ if (ail_filter_new(&f) != AIL_ERROR_OK)
+ return -1;
+ if (ail_filter_add_str(f, AIL_PROP_EXEC_STR, exepath) != AIL_ERROR_OK) {
+ ail_filter_destroy(f);
+ return -1;
+ }
+ if (ail_filter_count_appinfo(f, &count) != AIL_ERROR_OK)
+ LOGERR("Error: failed to count appinfo\n");
+ if (count) {
+ ret = ail_filter_list_appinfo_foreach(f,
+ appinfo_get_appid_func, (void *)app_id);
+ if (ret == AIL_ERROR_OK && app_id[0] != '\0') {
+ LOGINFO("ail filter list get appid (%s)\n", app_id);
+ ret = 1;
+ }
+ }
+ if (!count)
+ ret = -1;
+ if (f)
+ ail_filter_destroy(f);
+ return ret;
+}
+static int _set_crash_time_info(struct crashinfo *cinfo, char *timesecstr)
+{
+ if (timesecstr == NULL)
+ return -1;
+ snprintf(cinfo->timesec, sizeof(cinfo->timesec), "%s", timesecstr);
+ cinfo->crash_time = atol(cinfo->timesec);
+ /*gmtime_r(&cur_time, &ctime);*/
+ localtime_r(&(cinfo->crash_time), &(cinfo->crash_tm));
+ strftime(cinfo->timestr, sizeof(cinfo->timestr), "%Y%m%d%H%M%S", &(cinfo->crash_tm));
+ return 1;
+}
+/* write crash base information at crash report file */
+static cw_ret_type cw_write_crash_base_info(struct crashinfo *cinfo)
+{
+ char *p_exepath = NULL;
+ char *timestr[64];
+ char *timeoffsetstr[16];
+
+ if (cinfo == NULL || cinfo->csfd == 0)
+ return CW_RETURN_INVALID_PARAMETER;
+ /* print version info */
+ fprintf_fd(cinfo->csfd, "\n%s\n", CRASH_CRASHINFO_TITLE);
+ if (cinfo->mode == CW_MODE_COL) {
+ fprintf_fd(cinfo->csfd,
+ "Process Name: %s\n", cinfo->processname);
+ } else {
+ p_exepath = strrchr(cinfo->exepath, '/');
+ if (p_exepath != NULL && p_exepath[1] != '\0')
+ fprintf_fd(cinfo->csfd,
+ "Process Name: %s\n", p_exepath + 1);
+ }
+ fprintf_fd(cinfo->csfd, "PID: %s\n", cinfo->pid);
+ strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S(GMT%z)", &(cinfo->crash_tm));
+ fprintf_fd(cinfo->csfd, "Date: %s\n", timestr, timeoffsetstr);
+ fprintf_fd(cinfo->csfd, "Executable File Path: %s\n", cinfo->exepath);
+ if (cinfo->mode == CW_MODE_COL)
+ fprintf_fd(cinfo->csfd, "Signal: %s\n", cinfo->signal);
+ return CW_RETURN_OK;
+}
+/* write system version information at crash report file */
+static cw_ret_type cw_write_version_info(struct crashinfo *cinfo)
+{
+ char *tizenversion = NULL;
+ char *model = NULL;
+ char *buildstring = NULL;
+ char *builddate = NULL;
+ char *buildtime = NULL;
+
+ if (cinfo == NULL || cinfo->csfd == 0)
+ return CW_RETURN_INVALID_PARAMETER;
+ int fd = cinfo->csfd;
+ /* print version info */
+ fprintf_fd(fd, "%s\n", CRASH_SW_VERSIONINFO_TITLE);
+ if (system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &model) < 0)
+ return CW_RETURN_ERROR;
+ if (model) {
+ fprintf_fd(fd, "Model: %s\n", model);
+ free(model);
+ }
+ if (system_info_get_value_string(SYSTEM_INFO_KEY_TIZEN_VERSION,
+ &tizenversion) < 0) {
+ return CW_RETURN_ERROR;
+ }
+ if (tizenversion) {
+ fprintf_fd(fd, "Tizen-Version: %s\n", tizenversion);
+ free(tizenversion);
+ }
+ if (system_info_get_value_string(SYSTEM_INFO_KEY_BUILD_STRING,
+ &buildstring) < 0) {
+ return CW_RETURN_ERROR;
+ }
+ if (buildstring) {
+ fprintf_fd(fd, "Build-Number: %s\n", buildstring);
+ free(buildstring);
+ }
+ if (system_info_get_value_string(SYSTEM_INFO_KEY_BUILD_DATE,
+ &builddate) < 0) {
+ return CW_RETURN_ERROR;
+ }
+ if (system_info_get_value_string(SYSTEM_INFO_KEY_BUILD_TIME,
+ &buildtime) < 0) {
+ return CW_RETURN_ERROR;
+ }
+ if (builddate && buildtime)
+ fprintf_fd(fd, "Build-Date: %s %s\n", builddate, buildtime);
+ if (builddate)
+ free(builddate);
+ if (buildtime)
+ free(buildtime);
+ return CW_RETURN_OK;
+}
+/* write system memory information at crash report file */
+static cw_ret_type cw_write_mem_info(struct crashinfo *cinfo)
+{
+ int meminfo = 0;
+ char linebuf[BUF_SIZE] = {0, };
+ char infoname[20];
+ char memsize1[24];
+
+ if (cinfo == NULL || cinfo->csfd == 0)
+ return CW_RETURN_INVALID_PARAMETER;
+ int fd = cinfo->csfd;
+ /* print meminfo */
+ fprintf_fd(fd, "\n%s\n", CRASH_MEMINFO_TITLE);
+ meminfo = open(MEMINFO_PATH, O_RDONLY);
+ if (meminfo < 0) {
+ LOGERR("can't open %s\n", MEMINFO_PATH);
+ return CW_RETURN_ERROR;
+ } else {
+ while (fgets_fd(linebuf, BUF_SIZE, meminfo) != NULL) {
+ sscanf(linebuf, "%s %s %*s", infoname, memsize1);
+ if (strcmp("MemTotal:", infoname) == 0) {
+ fprintf_fd(fd, "%s %s KB\n", infoname,
+ memsize1);
+ } else if (strcmp("MemFree:", infoname) == 0) {
+ fprintf_fd(fd, "%s %s KB\n", infoname,
+ memsize1);
+ } else if (strcmp("Buffers:", infoname) == 0) {
+ fprintf_fd(fd, "%s %s KB\n",
+ infoname, memsize1);
+ } else if (strcmp("Cached:", infoname) == 0) {
+ fprintf_fd(fd, "%s %s KB\n",
+ infoname, memsize1);
+ break;
+ }
+ }
+ close(meminfo);
+ }
+ return CW_RETURN_OK;
+}
+/* write dlogdump at crash report file */
+static cw_ret_type cw_write_dlogdump(struct crashinfo *cinfo)
+{
+ int readnum = 0;
+ int pos = 0;
+ FILE *mfp = NULL;
+ FILE *csfp = NULL;
+ char *tbuf = NULL;
+ char mbuf[PATH_LEN] = {0, };
+ char cbuf[PATH_LEN] = {0, };
+ if (cinfo == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ csfp = fopen(cinfo->reportfile, "a+");
+ retvm_if(csfp == NULL, CW_RETURN_INVALID_PARAMETER,
+ "Failed to open (%s)\n", cinfo->reportfile);
+ tbuf = (char *)malloc(DM_BUF_SIZE);
+ if (tbuf == NULL) {
+ fclose(csfp);
+ return CW_RETURN_OUT_OF_MEMORY;
+ }
+ fprintf(csfp, "\n%s\n", CRASH_DLOG_TITLE);
+ snprintf(mbuf, sizeof(mbuf), "%s/%s_%s.dlogdump", cinfo->dumppath,
+ cinfo->processname, cinfo->timestr);
+ mfp = fopen(mbuf, "r");
+ if (mfp == NULL) {
+ LOGERR("Failed to open %s\n", mbuf);
+ fclose(csfp);
+ free(tbuf);
+ return CW_RETURN_ERROR;
+ }
+ snprintf(mbuf, sizeof(mbuf), "%s%s%s",
+ cinfo->modestr, cinfo->processname, cinfo->timesec);
+ while (fgets(cbuf, PATH_LEN, mfp)) {
+ int len = strlen(cbuf);
+ if (!len)
+ continue;
+ cbuf[len] = '\0';
+ if (strstr(cbuf, mbuf) != NULL)
+ pos = ftell(mfp);
+ }
+ /* check data size from end postion */
+ if (fseek(mfp, (pos-DM_BUF_SIZE - 1), SEEK_SET) < 0) {
+ fseek(mfp, 0L, SEEK_SET);
+ readnum = fread(tbuf, 1, DM_BUF_SIZE, mfp);
+ } else {
+ readnum = fread(tbuf, 1, DM_BUF_SIZE, mfp);
+ }
+ tbuf[readnum] = '\0';
+ fprintf(csfp, "%s\n", tbuf);
+ fprintf(csfp, "%s\n", CRASH_DLOG_TITLE_E);
+ fclose(csfp);
+ fclose(mfp);
+ free(tbuf);
+ return CW_RETURN_OK;
+}
+static cw_ret_type cw_conf(struct crashstatus *cstatus)
+{
+ if (access(TIZEN_DEBUG_MODE_FILE, F_OK) == 0) {
+ cstatus->b_debug_mode = 1;
+ LOGDEBUG("debug mode on\n");
+ } else {
+ cstatus->b_debug_mode = 0;
+ LOGDEBUG("debug mode off\n");
+ }
+ return CW_RETURN_OK;
+}
+/* crash info struct initialize */
+static cw_ret_type cw_info_init(struct crashinfo *cinfo)
+{
+ if (cinfo == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ cinfo->b_core_dump = 0;
+ cinfo->b_info_file = 0;
+ cinfo->b_dlog_dump = 0;
+ cinfo->b_app_id = 0;
+ if (_get_app_id(cinfo->exepath, cinfo->app_id) != 1) {
+ snprintf(cinfo->app_id, sizeof(cinfo->app_id),
+ "%s", cinfo->processname);
+ } else
+ cinfo->b_app_id = 1;
+ snprintf(cinfo->dumppath, sizeof(cinfo->dumppath),
+ "%s/%s_%s", CRASH_DUMP_PATH,
+ cinfo->processname, cinfo->timestr);
+ snprintf(cinfo->reportfile, sizeof(cinfo->reportfile),
+ "%s/%s_%s.cs", CRASH_REPORT_PATH,
+ cinfo->app_id, cinfo->timestr);
+ snprintf(cinfo->infofile, sizeof(cinfo->infofile),
+ "%s/%s_%s.info", CRASH_INFO_PATH,
+ cinfo->pid, cinfo->timesec);
+ snprintf(cinfo->pkginfofile, sizeof(cinfo->pkginfofile),
+ "%s/pkg.info", cinfo->dumppath);
+ snprintf(cinfo->dumpzipfile, sizeof(cinfo->dumpzipfile),
+ "%s/%s_%s.tar.gz", CRASH_DUMP_PATH,
+ cinfo->app_id, cinfo->timestr);
+ return CW_RETURN_OK;
+}
+/*
+ * check /opt/usr mount status
+ * if can't access, try to mount
+ * if fail to mount, wait and recheck to access
+ */
+static cw_ret_type cw_check_mount_ready(void)
+{
+ int i = 0;
+ for (i = 0; i < CRASH_CHECK_MOUNT_TRY_NUM; i++) {
+ if (_check_dir_access(CRASH_CHECK_DISK_PATH) != 1) {
+ LOGINFO("can't access %s wait %d sec\n",
+ CRASH_CHECK_DISK_PATH, CRASH_CHECK_MOUNT_WAIT_TIME);
+ if (mount(TIZEN_OPT_USR_MOUNT,
+ CRASH_CHECK_DISK_PATH,
+ TIZEN_OPT_USR_TYPE,
+ 0, NULL) != 0)
+ sleep(CRASH_CHECK_MOUNT_WAIT_TIME);
+ } else
+ return CW_RETURN_OK;
+ }
+ return CW_RETURN_ERROR;
+}
+/*
+ * check previous ticket, dump and report file
+ * check disk available and reserve disk
+ */
+static cw_ret_type cw_init(struct crashinfo *cinfo,
+ struct crashstatus *cstatus)
+{
+ int del_num = 0;
+
+ if (cinfo == NULL || cstatus == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ /*cstatus->b_wifi_avail = _check_wifi_status();*/
+ cstatus->n_pre_report =
+ _count_pre_report(&(cstatus->reportlist));
+ if (cstatus->n_pre_report != 0 &&
+ CRASH_CHECK_REPORT_MAX_NUM <= cstatus->n_pre_report) {
+ del_num = cstatus->n_pre_report - CRASH_CHECK_REPORT_MAX_NUM;
+ _delete_pre_report(cstatus->reportlist, del_num);
+ } else {
+ LOGDEBUG("previous report file num is [%d]\n",
+ cstatus->n_pre_report);
+ }
+ cstatus->n_pre_ticket =
+ _count_pre_ticket(&(cstatus->ticketlist));
+ cstatus->n_pre_dump =
+ _count_pre_dump(&(cstatus->dumplist));
+ /*
+ for (i = 0; i < cstatus->n_pre_ticket; i++)
+ LOGDEBUG("[%d] %s\n", i, cstatus->ticketlist[i]->d_name);
+ */
+ if (cstatus->b_debug_mode == 1) {
+ if (cstatus->n_pre_dump != 0 &&
+ CRASH_CHECK_DUMP_MAX_NUM <= cstatus->n_pre_dump) {
+ del_num = cstatus->n_pre_dump - CRASH_CHECK_DUMP_MAX_NUM;
+ _delete_pre_dump(cstatus->dumplist, del_num);
+ _delete_pre_ticket(cstatus->ticketlist, del_num);
+ cstatus->b_disk_avail =
+ _check_disk_available(CRASH_CHECK_DISK_PATH,
+ CRASH_CHECK_SIZE);
+ } else {
+ LOGDEBUG("previous ticket and dump file num is [%d]\n",
+ cstatus->n_pre_ticket);
+ }
+ } else {
+ if (cstatus->n_pre_ticket != 0) {
+ delete_dir_contents(CRASH_TICKET_PATH, 0, NULL);
+ delete_dir_contents(CRASH_DUMP_PATH, 0, NULL);
+ delete_dir_contents(CRASH_CORE_PATH, 0, NULL);
+ }
+ }
+ cstatus->b_disk_avail =
+ _check_disk_available(CRASH_CHECK_DISK_PATH, CRASH_CHECK_SIZE);
+ /* check disk available size */
+ if (cstatus->b_disk_avail != 1) {
+ delete_dir_contents(CRASH_TICKET_PATH, 0, NULL);
+ delete_dir_contents(CRASH_DUMP_PATH, 0, NULL);
+ delete_dir_contents(CRASH_CORE_PATH, 0, NULL);
+ }
+ if (cw_info_init(cinfo) < 0) {
+ LOGERR("can't cw_info_init\n");
+ return CW_RETURN_ERROR;
+ }
+ _free_filelist(cstatus->reportlist, cstatus->n_pre_report);
+ _free_filelist(cstatus->ticketlist, cstatus->n_pre_ticket);
+ _free_filelist(cstatus->dumplist, cstatus->n_pre_dump);
+ return CW_RETURN_OK;
+}
+/* make dump directory */
+static cw_ret_type cw_make_dump_dir(struct crashinfo *cinfo)
+{
+ if (cinfo == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ /* make debug directory if absent */
+ if (_make_dir(CRASH_SAVE_PATH) != 1)
+ return CW_RETURN_ERROR;
+ if (_make_dir(cinfo->dumppath) != 1)
+ return CW_RETURN_ERROR;
+ LOGINFO("dump dir(%s)\n", cinfo->dumppath);
+ return CW_RETURN_OK;
+}
+/* dump /dev/log_main, /dev/log_system and /dev/log_radio*/
+static cw_ret_type cw_dump_dlog(struct crashinfo *cinfo)
+{
+ int ret = 0;
+ char cbuf[PATH_LEN] = {0, }; /* commad buff */
+ char buf[NAME_MAX] = {0, }; /* buffer */
+
+ if (cinfo == NULL)
+ return -1;
+ retvm_if(cinfo == NULL, CW_RETURN_INVALID_PARAMETER,
+ "Invalid argument: cinfo is NULL\n");
+ retvm_if(cinfo->reportfile == NULL, CW_RETURN_INVALID_PARAMETER,
+ "Invalid argument: cinfo->reportfile is NULL\n");
+ snprintf(buf, sizeof(buf), "%s/%s_%s.dlogdump", cinfo->dumppath,
+ cinfo->processname, cinfo->timestr);
+ LOGDEBUG("make main log file in %s\n", buf);
+ snprintf(cbuf, sizeof(cbuf), "dlogutil -v time -d -r 2000 -n 1 -f %s *:d", buf);
+ ret = system_command_with_timeout(CRASH_SYSTEM_CMD_TIMEOUT, cbuf);
+ if (0 <= ret)
+ cinfo->b_dlog_dump = 1;
+ memset(cbuf, 0, sizeof(cbuf));
+ snprintf(buf, sizeof(buf), "%s/radio.log", cinfo->dumppath);
+ LOGDEBUG("make radio log file in %s\n", buf);
+ snprintf(cbuf, sizeof(cbuf),
+ "dlogutil -v time -b radio -d -r 2000 -n 1 -f %s *:v", buf);
+ system_command_with_timeout(CRASH_SYSTEM_CMD_TIMEOUT, cbuf);
+ return CW_RETURN_OK;
+}
+/* copy from libsys info file to dump path */
+static cw_ret_type cw_get_libsys_info(struct crashinfo *cinfo)
+{
+ int ret = 0;
+ char cbuf[PATH_LEN] = {0, }; /* commad buff */
+ char dbuf[NAME_MAX] = {0, };
+
+ if (cinfo == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ snprintf(dbuf, sizeof(dbuf),
+ "%s/%s_%s.info",
+ cinfo->dumppath, cinfo->processname, cinfo->timestr);
+ if (file_exist(cinfo->infofile) != 1)
+ return CW_RETURN_ERROR;
+ LOGDEBUG("libsys info from %s to %s\n", cinfo->infofile, dbuf);
+#ifdef INTERNAL_COPY_FUNC
+ if (copy_file(cinfo->infofile, dbuf) == 1) {
+ cinfo->b_info_file = 1;
+ return CW_RETURN_OK;
+ } else {
+ LOGWARN("copy failed\n");
+ return CW_RETURN_ERROR;
+ }
+#else
+ snprintf(cbuf, sizeof(cbuf),
+ "cp %s %s", cinfo->infofile, dbuf);
+ ret = system_command_with_timeout(CRASH_SYSTEM_CMD_TIMEOUT, cbuf);
+ if (0 <= ret)
+ cinfo->b_info_file = 1;
+#endif
+ return CW_RETURN_OK;
+}
+/* get pakage information from ail or rpm */
+static cw_ret_type cw_get_pkg_info(struct crashinfo *cinfo)
+{
+ FILE *fp;
+ cw_ret_type ret = CW_RETURN_OK;
+ char cbuf[PATH_LEN] = {0, };
+
+ if (cinfo == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ if (cinfo->b_app_id == 1) {
+ ail_filter_h f;
+ if (ail_filter_new(&f) != AIL_ERROR_OK)
+ return CW_RETURN_ERROR;
+ if (ail_filter_add_str(f, AIL_PROP_EXEC_STR, cinfo->exepath)
+ != AIL_ERROR_OK) {
+ ail_filter_destroy(f);
+ return CW_RETURN_ERROR;
+ }
+ fp = fopen(cinfo->pkginfofile, "w");
+ if(fp == NULL) {
+ ail_filter_destroy(f);
+ return CW_RETURN_ERROR;
+ }
+ fseek(fp, 0L, SEEK_END);
+ fprintf(fp, "\n%s\n", CRASH_PACKAGEINFO_TITLE);
+ if (ail_filter_list_appinfo_foreach(f,
+ appinfo_list_func, (void *)fp)
+ != AIL_ERROR_OK)
+ ret = CW_RETURN_ERROR;
+ fclose(fp);
+ if (f)
+ ail_filter_destroy(f);
+ } else {
+ fp = fopen(cinfo->pkginfofile, "w");
+ retvm_if(fp == NULL, CW_RETURN_INVALID_PARAMETER,
+ "Failed to open %s\n", cinfo->pkginfofile);
+ fseek(fp, 0L, SEEK_END);
+ fprintf(fp, "\n%s\n", CRASH_PACKAGEINFO_TITLE);
+ fclose(fp);
+ snprintf(cbuf, sizeof(cbuf), "rpm -qif %s >> %s",
+ cinfo->exepath, cinfo->pkginfofile);
+ LOGDEBUG("cbuf (%s)\n", cbuf);
+ if (system_command_with_timeout(CRASH_SYSTEM_CMD_TIMEOUT, cbuf) < 0)
+ ret = CW_RETURN_ERROR;
+ }
+ return ret;
+}
+/* copy core dump file */
+static cw_ret_type cw_copy_coredump(struct crashinfo *cinfo)
+{
+ char sbuf[NAME_MAX] = {0, };
+ char dbuf[NAME_MAX] = {0, };
+ char cmdb[PATH_LEN] = {0, };
+
+ if (cinfo == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ snprintf(sbuf, sizeof(sbuf), "%s/%s_*",
+ CRASH_CORE_PATH, cinfo->pid);
+ snprintf(dbuf, sizeof(dbuf), "%s/%s_%s.coredump",
+ cinfo->dumppath, cinfo->processname, cinfo->timestr);
+ LOGDEBUG("copy core dump from %s to %s\n", sbuf, dbuf);
+ snprintf(cmdb, sizeof(cmdb), "mv %s %s", sbuf, dbuf);
+ if (system(cmdb) < 0)
+ return CW_RETURN_ERROR;
+ return CW_RETURN_OK;
+}
+/* gather etc files with rule */
+static cw_ret_type cw_gather_etc_files(struct crashinfo *cinfo)
+{
+ int i;
+ char cbuf[PATH_LEN] = {0, };
+
+ if (cinfo == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ for (i = 0; i < CW_GATHER_MAX; i++) {
+ if (g_crule[i].dump_on) {
+ snprintf(cbuf, sizeof(cbuf), "%s%s%s",
+ g_crule[i].cmd, cinfo->dumppath, g_crule[i].dst);
+ if (g_crule[i].log_type == CW_GATHER_SS)
+ system(cbuf);
+ else
+ system_command_with_timeout(CRASH_SYSTEM_CMD_TIMEOUT, cbuf);
+ LOGDEBUG("gather info (%s)\n", cbuf);
+ memset(cbuf, 0, sizeof(cbuf));
+ }
+ }
+ return CW_RETURN_OK;
+}
+/* create and write report file */
+static cw_ret_type cw_write_report(struct crashinfo *cinfo)
+{
+ if (cinfo == NULL || cinfo->reportfile[0] == '\0')
+ return CW_RETURN_INVALID_PARAMETER;
+ LOGINFO("crash report file is %s\n", cinfo->reportfile);
+ /* create cs file */
+ cinfo->csfd = creat(cinfo->reportfile, FILE_PERMS);
+ if (cinfo->csfd < 0) {
+ LOGWARN("can't create %s. errno = %s\n",
+ cinfo->reportfile, strerror(errno));
+ return CW_RETURN_ERROR;
+ }
+ chown(cinfo->reportfile, 0, 5000);
+ chmod(cinfo->reportfile, 0766);
+ if (cw_write_version_info(cinfo) != CW_RETURN_OK)
+ LOGWARN("can't write version info\n");
+ if (cw_write_crash_base_info(cinfo) != CW_RETURN_OK)
+ LOGWARN("can't write base info\n");
+#if 0
+ if (_write_mem_info(cinfo) < 0)
+ LOGERR("can't write mem info info\n");
+#endif
+ close(cinfo->csfd);
+ if (cinfo->b_info_file) {
+ if (cat_file(cinfo->infofile, cinfo->reportfile) < 0)
+ LOGWARN("can't cat libsys info file\n");
+ }
+ if (cat_file(cinfo->pkginfofile, cinfo->reportfile) < 0)
+ LOGWARN("can't write pkg info\n");
+ if (cw_dump_dlog(cinfo) != CW_RETURN_OK) {
+ LOGWARN("can't cw_dump_dlog\n");
+ }
+ if (cinfo->b_dlog_dump) {
+ if (cw_write_dlogdump(cinfo) != CW_RETURN_OK)
+ LOGWARN("can't write dlogdump\n");
+ }
+ return CW_RETURN_OK;
+}
+/* make dump tar file */
+static cw_ret_type cw_make_zip_file(struct crashinfo *cinfo)
+{
+ int ret = 0;
+ struct stat file_info;
+ char cmdb[PATH_LEN] = {0, };
+
+ if (cinfo == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ snprintf(cmdb, sizeof(cmdb), "cp %s %s/%s_%s.cs",
+ cinfo->reportfile, cinfo->dumppath, cinfo->app_id, cinfo->timestr);
+ ret = system_command_with_timeout(CRASH_SYSTEM_CMD_TIMEOUT, cmdb);
+ snprintf(cmdb, sizeof(cmdb), "tar zcf %s -C %s %s_%s",
+ cinfo->dumpzipfile, CRASH_DUMP_PATH,
+ cinfo->processname, cinfo->timestr);
+ ret = system(cmdb);
+ LOGDEBUG("compress(%s)\n", cmdb);
+ ret = stat(cinfo->dumpzipfile, &file_info);
+ retvm_if(ret < -1, -1, "Failed to tar (%s)\n", cinfo->dumpzipfile);
+ chown(cinfo->dumpzipfile, 0, 5000);
+ if (chmod(cinfo->dumpzipfile, 0766) < 0)
+ LOGWARN("can't chmod (%s)\n", cinfo->dumpzipfile);
+ else
+ LOGDEBUG("chmod (%s)\n", cinfo->dumpzipfile);
+ return ret;
+}
+/* remove libsys information file*/
+static cw_ret_type cw_clean(struct crashinfo *cinfo)
+{
+ if (cinfo == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ if (unlink(cinfo->infofile) < 0)
+ LOGWARN("can't unlink (%s)\n", cinfo->infofile);
+#ifdef CLEAR_DUMP_PATH
+ if (delete_dir_contents(cinfo->dumppath, 1, NULL) < 0) {
+ LOGWARN("can't delete_dir_contents (%s)\n", cinfo->dumppath);
+ }
+ if (cinfo->csfd)
+ close(cinfo->csfd);
+#endif
+ return CW_RETURN_OK;
+}
+/*
+ * clean work file(core dump and libsys info) and
+ */
+static void cw_exit(struct crashinfo *cinfo,
+ struct crashstatus *cstatus)
+{
+ if (cstatus == NULL || cinfo == NULL)
+ return;
+ cw_clean(cinfo);
+}
+/*
+ * add ticket which is notification file for mobile care
+ * It has dump and report file path
+ */
+static cw_ret_type cw_add_ticket(char *app_id, char *timestr,
+ char *reportfile, char *dumpfile)
+{
+ FILE *fp = NULL;
+ char path[PATH_LEN] = {0, };
+
+ if (app_id == NULL || timestr == NULL ||
+ reportfile == NULL || dumpfile == NULL)
+ return CW_RETURN_INVALID_PARAMETER;
+ snprintf(path, sizeof(path), "%s/%s_%s.ct",
+ CRASH_TICKET_PATH, app_id, timestr);
+ fp = fopen(path, "a+");
+ retvm_if(fp == NULL, CW_RETURN_ERROR, "Failed to fopen (%s)\n", path);
+ fprintf(fp, "%s\n", reportfile);
+ fprintf(fp, "%s\n", dumpfile);
+ fclose(fp);
+ chown(path, 0, 5000);
+ if (chmod(path, 0766) < 0)
+ LOGWARN("can't chmod (%s)\n", path);
+ else
+ LOGDEBUG("chmod (%s)\n", path);
+ return CW_RETURN_OK;
+}
+/* crash worker function */
+static void crash_worker(struct appdata *ad)
+{
+ retm_if(ad == NULL, "Invalid argument: appdata is NULL\n");
+ struct crashinfo *cinfo = &(ad->csinfo);
+ retm_if(cinfo == NULL, "can't get crashinfo pointer\n");
+ struct crashstatus *cstatus = &(ad->cstatus);
+ LOGWARN("crash_worker start(%s%s%s)\n",
+ cinfo->modestr, cinfo->processname, cinfo->timesec);
+ LOGDEBUG("mode(%s)\n", cinfo->modestr);
+ LOGDEBUG("processname(%s)\n", cinfo->processname);
+ LOGDEBUG("time(%s)\n", cinfo->timestr);
+ LOGDEBUG("pid(%s)\n", cinfo->pid);
+ if (cinfo->mode == CW_MODE_COL)
+ LOGDEBUG("signal(%s)\n", cinfo->signal);
+ else
+ LOGDEBUG("exepath(%s)\n", cinfo->exepath);
+ if (cinfo->mode == CW_MODE_MOD) {
+ LOGDEBUG("modem crash work_thread_cb exited\n");
+ return;
+ }
+ if (cw_conf(cstatus) != CW_RETURN_OK)
+ LOGWARN("can't get crash worker configuration\n");
+
+ if (cw_check_mount_ready() != CW_RETURN_OK) {
+ LOGERR("can't cw_check_mount_ready\n");
+ return;
+ }
+ if (cw_init(cinfo, cstatus) != CW_RETURN_OK) {
+ LOGERR("can't cw_init\n");
+ return;
+ }
+ if (cw_make_dump_dir(cinfo) != CW_RETURN_OK) {
+ LOGERR("can't cw_make_dump_dir\n");
+ return;
+ }
+ if (cw_get_pkg_info(cinfo) != CW_RETURN_OK) {
+ LOGWARN("can't cw_get_pkg_info\n");
+ }
+ if (cw_get_libsys_info(cinfo) != CW_RETURN_OK) {
+ LOGWARN("can't cw_get_libsys_info\n");
+ }
+ if (cw_write_report(cinfo) != CW_RETURN_OK)
+ LOGWARN("can't cw_write_report\n");
+
+ if (cstatus->b_debug_mode == 1) {
+ if (cw_copy_coredump(cinfo) != CW_RETURN_OK)
+ LOGWARN("can't cw_copy_coredump\n");
+ }
+ if (cstatus->b_debug_mode == 1) {
+ if (cw_gather_etc_files(cinfo) != CW_RETURN_OK) {
+ LOGWARN("can't cw_gather_info_files\n");
+ }
+ }
+ if (cstatus->b_debug_mode == 1) {
+ if (cw_make_zip_file(cinfo) != CW_RETURN_OK) {
+ LOGWARN("can't cw_make_zip_file\n");
+ } else {
+ if (cw_add_ticket(cinfo->app_id, cinfo->timestr,
+ cinfo->reportfile, cinfo->dumpzipfile)
+ != CW_RETURN_OK) {
+ LOGWARN("can't _add_ticket (%s, %s)\n",
+ cinfo->reportfile, cinfo->dumpzipfile);
+ }
+ }
+ }
+ cw_exit(cinfo, cstatus);
+ LOGWARN("crash_worker done\n");
+ return;
+}
+/* allocation appdata and check argument num and variable*/
+int main(int argc, char *argv[])
+{
+ int i;
+ time_t cur_time;
+ struct tm ctime;
+ struct appdata *ad = (struct appdata *)malloc(sizeof(struct appdata));
+ retvm_if(ad == NULL, -1, "can't alloc struct crasinfo\n");
+ struct crashinfo *cinfo = &(ad->csinfo);
+ LOGDEBUG("argc(%d)\n", argc);
+ if (argc < CRASH_ARG_NUM) {
+ LOGERR("argc is (%d) wrong argument\n", argc);
+ return -1;
+ }
+ if (CRASH_ARG_NUM < argc) {
+ LOGERR("argc is (%d) wrong argument\n", argc);
+ return -1;
+ }
+ for (i = 0; i < argc; i++) {
+ if (argv[i]) {
+ LOGDEBUG("%d, %s\n", i, argv[i]);
+ } else {
+ LOGERR("%d argument is NULL\n", i);
+ return -1;
+ }
+ }
+ /* input crash info structure from arguments */
+ snprintf(cinfo->modestr, sizeof(cinfo->modestr), "%s", argv[1]);
+ switch (cinfo->modestr[0]) {
+ case 'S':
+ cinfo->mode = CW_MODE_SYA;
+ break;
+ case 'M':
+ cinfo->mode = CW_MODE_MOD;
+ break;
+ case 'C':
+ cinfo->mode = CW_MODE_COL;
+ break;
+ case 'A':
+ cinfo->mode = CW_MODE_API;
+ break;
+ default:
+ LOGERR("arg %s is wrong\n", cinfo->modestr);
+ return -1;
+ }
+ snprintf(cinfo->processname, sizeof(cinfo->processname), "%s", argv[2]);
+ _set_crash_time_info(cinfo, argv[3]);
+ snprintf(cinfo->pid, sizeof(cinfo->pid), "%s", argv[4]);
+ /*if it is launched from core-launcher
+ , 5' argument is signal information*/
+ if (cinfo->mode == CW_MODE_COL)
+ snprintf(cinfo->signal, sizeof(cinfo->signal), "%s", argv[5]);
+ else
+ snprintf(cinfo->exepath, sizeof(cinfo->exepath), "%s", argv[5]);
+ /* call crash_worker */
+ crash_worker(ad);
+ if (ad) {
+ free(ad);
+ ad = NULL;
+ }
+ return 0;
+}
diff --git a/crash-worker/crash-worker.h b/crash-worker/crash-worker.h
new file mode 100644
index 0000000..02c0edf
--- /dev/null
+++ b/crash-worker/crash-worker.h
@@ -0,0 +1,177 @@
+/*
+ * CRASH-WORKER
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+
+#ifndef __CRASH_WORKER_H__
+#define __CRASH_WORKER_H__
+
+#define TIZEN_OPT_USR_MOUNT "/dev/mmcblk0p7"
+#define TIZEN_OPT_USR_TYPE "ext4"
+#define TIZEN_DEBUG_MODE_FILE "/opt/etc/.coredump"
+#define DIR_PERMS (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)
+#define FILE_PERMS (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
+
+#define VIP_PATH "/tmp/vip"
+#define PERMANENT_PATH "/tmp/permanent"
+#define VERINFO_PATH "/etc/info.ini"
+#define MEMINFO_PATH "/proc/meminfo"
+
+#define CRASH_PID_MAX 7
+#define CRASH_MODE_MAX 2
+#define CRASH_SIGNAL_MAX 8
+#define CRASH_TIME_MAX 65
+#define CRASH_PROCESSNAME_MAX NAME_MAX
+#define PATH_LEN (NAME_MAX + NAME_MAX)
+
+#define CRASH_ARG_NUM 6
+#define CRASH_SYSTEM_CMD_TIMEOUT 10
+
+#define CRASH_CHECK_MOUNT_TRY_NUM 2
+#define CRASH_CHECK_MOUNT_WAIT_TIME 5
+#define CRASH_CHECK_DUMP_MAX_NUM 10
+#define CRASH_CHECK_REPORT_MAX_NUM 100
+#define CRASH_CHECK_SIZE (1024 * 1024)
+
+#define CRASH_UNKNOWN "unknown"
+#define CRASH_TEMP_LIST "/tmp/.list"
+
+#define CRASH_CHECK_DISK_PATH "/opt/usr"
+#define CRASH_SYSTEM_PATH "/opt/share/crash"
+#define CRASH_INFO_PATH "/opt/share/crash/info"
+
+#define CRASH_SAVE_PATH "/opt/usr/share/crash"
+#define CRASH_CORE_PATH "/opt/usr/share/crash/core"
+#define CRASH_TICKET_PATH "/opt/usr/share/crash/ticket"
+#define CRASH_DUMP_PATH "/opt/usr/share/crash/dump"
+#define CRASH_REPORT_PATH "/opt/usr/share/crash/report"
+
+#define CRASH_CALLSTACKINFO_TITLE "Callstack Information"
+#define CRASH_CALLSTACKINFO_TITLE_E "End of Call Stack"
+#define CRASH_CRASHINFO_TITLE "Crash Information"
+#define CRASH_DLOG_TITLE "Latest Debug Message Information"
+#define CRASH_DLOG_TITLE_E "End of latest debug message"
+#define CRASH_PACKAGEINFO_TITLE "Package Information"
+#define CRASH_MAPSINFO_TITLE "Maps Information"
+#define CRASH_MAPSINFO_TITLE_E "End of Maps Information"
+#define CRASH_MEMINFO_TITLE "Memory Information"
+#define CRASH_REGISTERINFO_TITLE "Register Information"
+#define CRASH_SW_VERSIONINFO_TITLE "S/W Version Information"
+
+#define CRASH_MODE_STR_MOD "M" /* called modem */
+#define CRASH_MODE_STR_COL "C" /* called core launcher */
+#define CRASH_MODE_STR_SYA "S" /* called sys assert */
+#define CRASH_MODE_STR_API "A" /* called Tizen API */
+
+#ifndef __VCONF_INTERNAL_CRASH_KEYS_H__
+#define VCONFKEY_CRASH_AUTOSEND "db/crash/autosend"
+#define VCONFKEY_CRASH_AUTOCLOSE "db/crash/autoclose"
+#define VCONFKEY_CRASH_PROGRESS "db/crash/progress"
+#define VCONFKEY_CRASH_SENDFLAG "db/crash/sendflag"
+#define VCONFKEY_CRASH_POPUP "db/crash/popup"
+#endif
+
+typedef enum {
+ CW_RETURN_OK = 0, /**< General success */
+ CW_RETURN_ERROR = -1, /**< General error */
+ CW_RETURN_INVALID_PARAMETER = -2, /**< Invalid parameter */
+ CW_RETURN_OUT_OF_MEMORY = -3, /**< Out of memory */
+} cw_ret_type;
+
+typedef enum {
+ CW_MODE_MOD = 0x4D, /**<called modem*/
+ CW_MODE_COL = 0x43, /**< called core-launcher*/
+ CW_MODE_SYA = 0x53, /**<called libsys-assert */
+ CW_MODE_API = 0x41, /** called API */
+} cw_mode_type;
+
+typedef enum {
+ CW_GATHER_DLOG = 0, /* dlog */
+ CW_GATHER_PS = 1, /* ps */
+ CW_GATHER_MEMPS = 2, /* memps */
+ CW_GATHER_TOP = 3, /* top */
+ CW_GATHER_CP = 4, /* CP crash log */
+ CW_GATHER_SS = 5, /* screen shot */
+ CW_GATHER_KL = 6, /* kernel log */
+ CW_GATHER_RL = 7, /* radio log */
+ CW_GATHER_XL = 8, /* Xorg log */
+ CW_GATHER_MAX,
+} cw_gather_log_type;
+
+typedef struct
+{
+ cw_gather_log_type log_type;
+ int dump_on;
+ const char *cmd;
+ const char *dst;
+} cw_gather_log_rule;
+
+struct crashstatus
+{
+ int b_debug_mode;
+ int b_disk_avail;
+ int b_wifi_avail;
+ int n_pre_dump;
+ int n_pre_report;
+ int n_pre_ticket;
+ struct dirent **dumplist;
+ struct dirent **reportlist;
+ struct dirent **ticketlist;
+};
+
+struct crashinfo
+{
+ int csfd;
+ int b_app_id;
+ int b_core_dump;
+ int b_info_file;
+ int b_dlog_dump;
+ time_t crash_time;
+ struct tm crash_tm;
+/* crash_worker arguments */
+ char modestr[CRASH_MODE_MAX];
+ char processname[CRASH_PROCESSNAME_MAX];
+ char timesec[CRASH_TIME_MAX];
+ char pid[CRASH_PID_MAX];
+ char exepath[PATH_LEN];
+ char signal[CRASH_SIGNAL_MAX];
+
+ cw_mode_type mode;
+ char app_id[CRASH_PROCESSNAME_MAX];
+ char timestr[CRASH_TIME_MAX];
+ char dumppath[PATH_LEN];
+ char dumpzipfile[PATH_LEN];
+ char reportfile[NAME_MAX];
+ char infofile[NAME_MAX];
+ char pkginfofile[NAME_MAX];
+
+#ifdef SEND_FUNC_ENABLE
+ char modelname[NAME_MAX];
+ char version[NAME_MAX];
+ char buildinfo[PATH_LEN];
+ char methodinfo[PATH_LEN];
+ char lastcallstackinfo[PATH_LEN];
+#endif
+ /* add more variables here */
+};
+
+struct appdata
+{
+ struct crashstatus cstatus;
+ struct crashinfo csinfo;
+};
+#endif
+/* __CRASH_WORKER_H__ */
+
diff --git a/crash-worker/util.c b/crash-worker/util.c
new file mode 100644
index 0000000..2b00a99
--- /dev/null
+++ b/crash-worker/util.c
@@ -0,0 +1,299 @@
+/*
+ * CRASH-WORKER
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <limits.h>
+#include <string.h>
+#include <signal.h>
+#include <time.h>
+#include <errno.h>
+#include <wait.h>
+#include "util.h"
+
+int system_command(char *command)
+{
+ int pid = 0,
+ status = 0;
+ const char *environ[] = { NULL };
+
+ if (command == NULL)
+ return -1;
+ pid = fork();
+ if (pid == -1)
+ return -1;
+ if (pid == 0) {
+ char *argv[4];
+ argv[0] = "sh";
+ argv[1] = "-c";
+ argv[2] = (char *)command;
+ argv[3] = 0;
+ execve("/bin/sh", argv, (char **)environ);
+ exit(127);
+ }
+ do {
+ if (waitpid(pid, &status, 0) == -1) {
+ if (errno != EINTR)
+ return -1;
+ } else {
+ return status;
+ }
+ } while (1);
+
+ return status;
+}
+int system_command_with_timeout(int timeout_seconds, char *command)
+{
+ const char *environ[] = { NULL };
+
+ if (command == NULL)
+ return -1;
+ clock_t start = clock();
+ pid_t pid = fork();
+ /* handle error case */
+ if (pid < 0) {
+ LOGERR("fork: %s\n", strerror(errno));
+ return pid;
+ }
+ /* handle child case */
+ if (pid == 0) {
+ char *argv[4];
+ argv[0] = "sh";
+ argv[1] = "-c";
+ argv[2] = (char *)command;
+ argv[3] = 0;
+
+ execve("/bin/sh", argv, (char **)environ);
+ LOGINFO("exec(%s): %s\n", command, strerror(errno));
+ _exit(-1);
+ }
+ /* handle parent case */
+ for (;;) {
+ int status;
+ pid_t p = waitpid(pid, &status, WNOHANG);
+ float elapsed = (float) (clock() - start) / CLOCKS_PER_SEC;
+ if (p == pid) {
+ if (WIFSIGNALED(status))
+ LOGINFO("%s: Killed by signal %d\n", command, WTERMSIG(status));
+ else if (WIFEXITED(status) && WEXITSTATUS(status) > 0)
+ LOGINFO("%s: Exit code %d\n", command, WEXITSTATUS(status));
+ return status;
+ }
+ if (timeout_seconds && elapsed > timeout_seconds) {
+ LOGINFO("%s: Timed out after %.1fs (killing pid %d)\n",
+ command, elapsed, pid);
+ kill(pid, SIGTERM);
+ return -1;
+ }
+ /* poll every 0.1 sec */
+ usleep(100000);
+ }
+}
+
+/* WARNING : formatted string buffer is limited to 1024 byte */
+int fprintf_fd(int fd, const char *fmt, ...)
+{
+ int n;
+ int ret;
+ char buff[1024];
+ va_list args;
+
+ va_start(args, fmt);
+ n = vsnprintf(buff, 1024 - 1, fmt, args);
+ ret = write(fd, buff, n);
+ va_end(args);
+ return ret;
+}
+
+int file_exist(const char *file)
+{
+ FILE *fp;
+
+ fp = fopen(file, "r");
+ if (fp == NULL)
+ return -1;
+ fclose(fp);
+ return 1;
+}
+
+int write_fd(int fd, const void *buf, int len)
+{
+ int count;
+ int total;
+ total = 0;
+ while (len) {
+ count = write(fd, buf, len);
+ if (count < 0) {
+ if (total)
+ return total;
+ return count;
+ }
+ total += count;
+ buf = ((const char *)buf) + count;
+ len -= count;
+ }
+ return total;
+}
+
+int copy_file(char *src, char *dst)
+{
+ int sfd;
+ int dfd;
+ char buf[PIPE_BUF];
+
+ retvm_if(src == NULL, -1, "Invalid argument: source is NULL\n");
+ retvm_if(dst == NULL, -1, "Invalid argument: destination is NULL\n");
+ sfd = open(src, O_RDONLY);
+ if (sfd < 0) {
+ LOGERR("Failed to open (%s)\n", src);
+ return -1;
+ }
+ dfd = open(dst, O_WRONLY|O_CREAT|O_EXCL, 0644);
+ if (dfd < 0) {
+ close(sfd);
+ LOGERR("Failed to open (%s)\n", dst);
+ return -1;
+ }
+ for (;;) {
+ int ret = read(sfd, buf, sizeof(buf));
+ if (ret > 0)
+ ret = write_fd(dfd, buf, ret);
+ if (ret <= 0)
+ break;
+ }
+ close(sfd);
+ close(dfd);
+ LOGINFO("copy (%s) to (%s)\n", src, dst);
+ return 1;
+}
+
+int cat_file(char *src, char *dst)
+{
+ int sfd;
+ int dfd;
+ char buf[PIPE_BUF];
+
+ retvm_if(src == NULL, -1, "Invalid argument: source is NULL\n");
+ retvm_if(dst == NULL, -1, "Invalid argument: destination is NULL\n");
+ sfd = open(src, O_RDONLY);
+ if (sfd < 0) {
+ LOGERR("Failed to open (%s)\n", src);
+ return -1;
+ }
+ dfd = open(dst, O_WRONLY|O_APPEND);
+ if (dfd < 0) {
+ close(sfd);
+ LOGERR("Failed to open (%s)\n", dst);
+ return -1;
+ }
+ for (;;) {
+ int ret = read(sfd, buf, sizeof(buf));
+ if (ret > 0)
+ ret = write_fd(dfd, buf, ret);
+ if (ret <= 0)
+ break;
+ }
+ close(sfd);
+ close(dfd);
+ LOGINFO("copy (%s) to (%s)\n", src, dst);
+ return 1;
+}
+
+static int _delete_dir_contents(DIR *d, const char *ignore)
+{
+ int result = 0;
+ struct dirent *de;
+ int dfd;
+
+ dfd = dirfd(d);
+ if (dfd < 0)
+ return -1;
+ while ((de = readdir(d))) {
+ const char *name = de->d_name;
+ /* skip the ignore name if provided */
+ if (ignore && !strcmp(name, ignore))
+ continue;
+ if (de->d_type == DT_DIR) {
+ int subfd;
+ DIR *subdir;
+ /* always skip "." and ".." */
+ if (name[0] == '.') {
+ if (name[1] == 0)
+ continue;
+ if ((name[1] == '.') && (name[2] == 0))
+ continue;
+ }
+ subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY);
+ if (subfd < 0) {
+ LOGERR("Couldn't openat %s: %s\n", name, strerror(errno));
+ result = -1;
+ continue;
+ }
+ subdir = fdopendir(subfd);
+ if (subdir == NULL) {
+ LOGERR("Couldn't fdopendir %s: %s\n", name, strerror(errno));
+ close(subfd);
+ result = -1;
+ continue;
+ }
+ if (_delete_dir_contents(subdir, 0))
+ result = -1;
+ closedir(subdir);
+ if (unlinkat(dfd, name, AT_REMOVEDIR) < 0) {
+ LOGERR("Couldn't unlinkat %s: %s\n", name, strerror(errno));
+ result = -1;
+ }
+ } else {
+ if (unlinkat(dfd, name, 0) < 0) {
+ LOGE("Couldn't unlinkat %s: %s\n", name, strerror(errno));
+ result = -1;
+ }
+ }
+ }
+ return result;
+}
+
+int delete_dir_contents(const char *pathname,
+ int also_delete_dir,
+ const char *ignore)
+{
+ int res = 0;
+ DIR *d;
+
+ d = opendir(pathname);
+ if (d == NULL) {
+ LOGERR("Couldn't opendir %s: %s\n", pathname, strerror(errno));
+ return -errno;
+ }
+ res = _delete_dir_contents(d, ignore);
+ closedir(d);
+ if (also_delete_dir) {
+ if (rmdir(pathname)) {
+ LOGERR("Couldn't rmdir %s: %s\n", pathname, strerror(errno));
+ res = -1;
+ }
+ }
+ return res;
+}
+/**
+ * @}
+ */
diff --git a/crash-worker/util.h b/crash-worker/util.h
new file mode 100644
index 0000000..2981a48
--- /dev/null
+++ b/crash-worker/util.h
@@ -0,0 +1,43 @@
+/*
+ * CRASH-WORKER
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+#ifndef __DEF_UTIL_H__
+#define __DEF_UTIL_H__
+
+#include "util_log.h"
+
+extern int system_command(char *command);
+
+extern int system_command_with_timeout(int timeout_seconds, char *command);
+
+extern int fprintf_fd(int fd, const char *fmt, ...);
+
+extern int file_exist(const char *file);
+
+extern int write_fd(int fd, const void *buf, int len);
+
+extern int copy_file(char *src, char *dst);
+
+extern int cat_file(char *src, char *dst);
+
+extern int get_file_end_pos(char *file);
+
+extern int delete_dir_contents(const char *pathname, int also_delete_dir, const char *ignore);
+
+/**
+ * @}
+ */
+#endif
diff --git a/crash-worker/util_log.h b/crash-worker/util_log.h
new file mode 100644
index 0000000..b8882aa
--- /dev/null
+++ b/crash-worker/util_log.h
@@ -0,0 +1,71 @@
+/*
+ * CRASH-WORKER
+ * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+
+
+
+#ifndef __CRASH_WORKER_UTIL_LOG_H__
+#define __CRASH_WORKER_UTIL_LOG_H__
+
+#include <unistd.h>
+#include <dlog.h>
+
+#undef LOG_TAG
+#define LOG_TAG "CRASH_WORKER"
+
+#ifdef DEBUG_LOG_ON
+#define LOGDEBUG(fmt, arg...) LOGD(fmt, ##arg)
+#else
+#define LOGDEBUG(fmt, arg...) ((void)0)
+#endif
+
+#define LOGINFO(fmt, arg...) LOGI(fmt, ##arg)
+#define LOGWARN(fmt, arg...) LOGW(fmt, ##arg)
+#define LOGERR(fmt, arg...) LOGE(fmt, ##arg)
+
+#define retvm_if(expr, val, fmt, arg...) do { \
+ if(expr) { \
+ LOGERR(fmt, ##arg); \
+ LOGERR("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+} while (0)
+
+#define retv_if(expr, val) do { \
+ if(expr) { \
+ LOGERR("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+} while (0)
+
+#define retm_if(expr, fmt, arg...) do { \
+ if(expr) { \
+ LOGERR(fmt, ##arg); \
+ LOGERR("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+} while (0)
+
+#define ret_if(expr) do { \
+ if(expr) { \
+ LOGERR("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+} while (0)
+
+
+#endif
+/* __CRASH_WORKER_UTIL_LOG_H__ */
diff --git a/data/org.tizen.crash-popup.png b/data/org.tizen.crash-popup.png
new file mode 100755
index 0000000..5e2ed60
--- /dev/null
+++ b/data/org.tizen.crash-popup.png
Binary files differ
diff --git a/data/org.tizen.crash-popup.xml b/data/org.tizen.crash-popup.xml
new file mode 100644
index 0000000..1896a46
--- /dev/null
+++ b/data/org.tizen.crash-popup.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<manifest xmlns="http://tizen.org/ns/packages" package="org.tizen.crash-popup" version="0.1.2" install-location="internal-only">
+ <label>crash-popup</label>
+ <description>Crash-popup Application</description>
+ <ui-application appid="org.tizen.crash-popup" exec="/usr/apps/org.tizen.crash-popup/bin/crash-popup" nodisplay="true" multiple="false" type="capp" taskmanage="false">
+ <label>crash-popup</label>
+ </ui-application>
+</manifest>
diff --git a/edcs/crash-popup.edc b/edcs/crash-popup.edc
new file mode 100644
index 0000000..5c1bdd9
--- /dev/null
+++ b/edcs/crash-popup.edc
@@ -0,0 +1,140 @@
+#define FONT_NAME "GP45_ArabCJK_TouchWiz"
+
+collections {
+ group {
+ name, "main";
+
+ parts {
+ part { name, "background";
+ type, RECT;
+ description {
+ state, "default" 0.0;
+ color, 0 0 0 255;
+ }
+ }
+
+ part { name, "txt_title";
+ type, TEXT;
+ mouse_events, 0;
+ description {
+ state, "default" 0.0;
+ rel1 { relative, 0.0 0.0; to, background; }
+ rel2 { relative, 1.0 0.5; to, background; }
+ text { font, FONT_NAME; size, 30; align, 0.5 0.5; }
+ color, 255 255 255 255;
+ }
+ }
+
+ part { name, "txt_mesg";
+ type, TEXT;
+ mouse_events, 0;
+ description {
+ state, "default" 0.0;
+ rel1 { relative, 0.0 0.5; to, background; }
+ rel2 { relative, 1.0 1.0; to, background; }
+ text { font, FONT_NAME; size, 30; align, 0.5 0.5; }
+ color, 255 255 255 255;
+ }
+ }
+ }
+
+ programs {
+ program {
+ name, "click_exit";
+ source, "background";
+ signal, "mouse,clicked,1";
+ action, SIGNAL_EMIT "EXIT" "EDJ";
+ }
+ }
+ }
+
+
+group {
+ name: "autoscroll_conform";
+ parts{
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ scale:1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ part{
+ name: "top_padding";
+ type: RECT;
+ scale: 1; //allow scaling
+ description {
+ state: "default" 0.0;
+ visible: 0;
+ min : 0 1; //minimum size for gap filler
+ fixed: 0 1;
+ rel1 {
+ relative: 0.0 0.0;
+ to:bg;
+ }
+ rel2 {
+ relative: 1.0 0.0;
+ to:bg;
+ }
+ }
+ }
+ part {
+ name: "left_padding";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ visible: 0;
+ min : 0 0; //minimum size for gap filler
+ fixed: 1 0;
+ rel1 {
+ relative: 0.0 0.0;
+ to: "bg";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ to: "bg";
+ }
+ align: 0.0 0.0;
+ }
+ }
+ part {
+ name: "bg_conform";
+ type: RECT;
+ mouse_events: 0;
+ scale:1;
+ description {
+ state: "default" 0.0;
+ visible: 0;
+ rel1 {
+ relative: 0.0 1.0;
+ to_y:top_padding;
+ }
+ align: 0.0 0.0;
+ }
+ }
+ part {
+ name: "conform_part";
+ type: SWALLOW;
+ mouse_events: 1;
+ scale:1;
+ description {
+ fixed: 1 1;
+ state: "default" 0.0;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x:left_padding;
+ to_y:bg_conform;
+ }
+ align: 0.0 0.0;
+ }
+ }
+ }
+ }
+
+}
diff --git a/packaging/crash-worker-sdk.manifest b/packaging/crash-worker-sdk.manifest
new file mode 100644
index 0000000..d231ec6
--- /dev/null
+++ b/packaging/crash-worker-sdk.manifest
@@ -0,0 +1,32 @@
+<manifest>
+ <define>
+ <domain name="crash-worker"/>
+ <request>
+ <smack request="sys-assert::core" type="rwxat" />
+ <smack request="device::app_logging" type="rwxat" />
+ <smack request="device::sys_logging" type="rwxat" />
+ <smack request="system::homedir" type="rwxat" />
+ <smack request="system::vconf" type="rwxat" />
+ <smack request="system::media" type="rwxat" />
+ <smack request="system::share" type="rwxat" />
+ <smack request="system::use_internet" type="rw" />
+ <smack request="xorg" type="rw" />
+ <smack request="ail::db" type="rw" />
+ <smack request="dbus" type="rwx" />
+ </request>
+ <permit>
+ <smack permit="system::use_internet" type="rwx"/>
+ </permit>
+ </define>
+ <request>
+ <domain name="crash-worker"/>
+ </request>
+ <assign>
+ <filesystem path="/usr/bin/all_log_dump.sh" label="_" exec_label="none"/>
+ <filesystem path="/opt/usr/share/crash" label="sys-assert::core" exec_label="none"/>
+ <filesystem path="/opt/usr/share/crash/report" label="sys-assert::core" exec_label="none"/>
+ <filesystem path="/opt/usr/share/crash/core" label="sys-assert::core" exec_label="none"/>
+ <filesystem path="/opt/usr/share/crash/dump" label="sys-assert::core" exec_label="none"/>
+ <filesystem path="/opt/usr/share/crash/ticket" label="sys-assert::core" exec_label="none"/>
+ </assign>
+</manifest>
diff --git a/packaging/crash-worker-sdk.spec b/packaging/crash-worker-sdk.spec
new file mode 100644
index 0000000..859a0b7
--- /dev/null
+++ b/packaging/crash-worker-sdk.spec
@@ -0,0 +1,116 @@
+Name: crash-worker-sdk
+Summary: Crash-worker-sdk
+Version: 0.1.3
+Release: 3
+Group: Framework/system
+License: Apache-2.0
+Source0: %{name}-%{version}.tar.gz
+Source1001: crash-worker-sdk.manifest
+Source1002: org.tizen.crash-popup.manifest
+Source1003: org.tizen.crash-popup.rule
+BuildRequires: pkgconfig(appcore-common)
+BuildRequires: pkgconfig(appcore-efl)
+BuildRequires: pkgconfig(elementary)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(dbus-glib-1)
+BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(ecore-imf)
+BuildRequires: pkgconfig(ecore-file)
+BuildRequires: pkgconfig(ecore-x)
+BuildRequires: pkgconfig(ecore-input)
+BuildRequires: pkgconfig(ecore)
+BuildRequires: pkgconfig(ecore-evas)
+BuildRequires: pkgconfig(evas)
+BuildRequires: pkgconfig(edje)
+BuildRequires: pkgconfig(sqlite3)
+BuildRequires: pkgconfig(utilX)
+BuildRequires: pkgconfig(heynoti)
+BuildRequires: pkgconfig(iniparser)
+BuildRequires: pkgconfig(capi-system-info)
+BuildRequires: pkgconfig(ail)
+
+BuildRequires: cmake
+BuildRequires: edje-tools
+BuildRequires: gettext-devel
+
+Requires: sys-assert
+Requires(post): /usr/bin/vconftool
+Requires(post): coreutils
+%description
+crash-worker
+
+%package -n org.tizen.crash-popup
+Summary: crash-popup application
+Group: main
+Requires: %{name} = %{version}-%{release}
+
+%description -n org.tizen.crash-popup
+crash-popup application
+
+%prep
+%setup -q
+
+%build
+cp %{SOURCE1001} .
+cp %{SOURCE1002} .
+cp %{SOURCE1003} .
+%define DEBUG_LOG_ON 1
+cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+%make_install
+mkdir -p %{buildroot}/usr/share/license
+cp LICENSE.APLv2 %{buildroot}/usr/share/license/%{name}
+cp LICENSE.APLv2 %{buildroot}/usr/share/license/org.tizen.crash-popup
+
+%post
+mkdir -p /opt/usr/share/crash/report
+chown root:crash /opt/usr/share/crash/report
+chmod 775 /opt/usr/share/crash/report
+
+chown root:crash /opt/usr/share/crash
+chmod 775 /opt/usr/share/crash
+
+mkdir -p /opt/usr/share/crash/core
+chown root:crash /opt/usr/share/crash/core
+chmod 775 /opt/usr/share/crash/core
+
+mkdir -p /opt/usr/share/crash/dump
+chown root:crash /opt/usr/share/crash/dump
+chmod 775 /opt/usr/share/crash/dump
+
+mkdir -p /opt/usr/share/crash/ticket
+chown root:crash /opt/usr/share/crash/ticket
+chmod 775 /opt/usr/share/crash/ticket
+
+if [ -f %{_libdir}/rpm-plugins/msm.so ]; then
+ find /opt/usr/share/crash -print0 | xargs -0 chsmack -a 'sys-assert::core'
+ find /opt/usr/share/crash -type d -print0 | xargs -0 chsmack -t
+fi
+
+vconftool set -t int db/crash/popup "1" -f
+vconftool set -t int db/crash/autoclose "0" -f
+vconftool set -t int db/crash/autosend "1" -f
+vconftool set -t int db/crash/progress "0" -f
+vconftool set -t int db/crash/sendflag "0" -f
+%postun
+
+%files
+%manifest crash-worker-sdk.manifest
+%defattr(-,root,root,-)
+/usr/bin/crash-worker
+/usr/share/license/%{name}
+%attr(0744,root,root)/usr/bin/all_log_dump.sh
+
+%files -n org.tizen.crash-popup
+%manifest org.tizen.crash-popup.manifest
+/opt/etc/smack/accesses.d/org.tizen.crash-popup.rule
+%defattr(-,root,root,-)
+/usr/share/packages/org.tizen.crash-popup.xml
+/usr/share/icons/default/small/org.tizen.crash-popup.png
+/usr/apps/org.tizen.crash-popup/bin/crash-popup
+/usr/apps/org.tizen.crash-popup/res/edje/crash-popup.edj
+/usr/apps/org.tizen.crash-popup/res/locale/*/LC_MESSAGES/crash-popup.mo
+/usr/share/license/org.tizen.crash-popup
diff --git a/packaging/org.tizen.crash-popup.manifest b/packaging/org.tizen.crash-popup.manifest
new file mode 100644
index 0000000..52e1dbf
--- /dev/null
+++ b/packaging/org.tizen.crash-popup.manifest
@@ -0,0 +1,11 @@
+<manifest>
+ <define>
+ <domain name="org.tizen.crash-popup"/>
+ </define>
+ <assign>
+ <filesystem path="/usr/share/icons/default/small/org.tizen.crash-popup.png" label="_" exec_label="none"/>
+ </assign>
+ <request>
+ <domain name="org.tizen.crash-popup"/>
+ </request>
+</manifest>
diff --git a/packaging/org.tizen.crash-popup.rule b/packaging/org.tizen.crash-popup.rule
new file mode 100644
index 0000000..17f3e21
--- /dev/null
+++ b/packaging/org.tizen.crash-popup.rule
@@ -0,0 +1,20 @@
+org.tizen.crash-popup sys-assert::core rwxat
+org.tizen.crash-popup system::homedir rwxat
+org.tizen.crash-popup system::vconf rwxat
+org.tizen.crash-popup system::media rwxat
+org.tizen.crash-popup system::share rwxat
+org.tizen.crash-popup device::app_logging w
+org.tizen.app-tray org.tizen.crash-popup rx
+org.tizen.crash-popup dali rwxat
+e17 org.tizen.crash-popup rwx
+org.tizen.crash-popup ail::db rw
+org.tizen.crash-popup system::use_internet r
+org.tizen.crash-popup xorg rw
+org.tizen.crash-popup isf rwx
+org.tizen.crash-popup org.tizen.indicator rw
+org.tizen.crash-popup sound_server rw
+org.tizen.crash-popup dbus r
+org.tizen.crash-popup pulseaudio rwxat
+org.tizen.crash-popup stest-service w
+org.tizen.crash-popup mobileprint x
+org.tizen.crash-popup svi-data x