summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarol Lewandowski <k.lewandowsk@samsung.com>2017-09-29 10:58:03 +0200
committerKarol Lewandowski <k.lewandowsk@samsung.com>2017-09-29 12:32:50 +0200
commitb8e88cebfe9dc0e143d98b6bdf71466ba9a085ca (patch)
treecf48ca4527e7e43e02d4ba7463419cddd3d001d7
parent8be23e75bc33f969b46ed502e8a927058c0a33f3 (diff)
downloadinitrd-recovery-b8e88cebfe9dc0e143d98b6bdf71466ba9a085ca.tar.gz
initrd-recovery-b8e88cebfe9dc0e143d98b6bdf71466ba9a085ca.tar.bz2
initrd-recovery-b8e88cebfe9dc0e143d98b6bdf71466ba9a085ca.zip
Install system-recovery binary for both gui & non-gui platforms
Following changes were applied: * system-recovery is build twice for gui & non-gui versions * recovery-init is same for both gui & non-gui It detects environment and exectues appropriate system-recovery binary. * needless %post/pre scripts were removed It should be enough to install differently named files directly from package. * additional code reorganization applied to source tree Needed to separate gui & non-gui variants. Change-Id: I13302d0cb5f441ef2a28d040599823f1503f61e3
-rw-r--r--Makefile.am32
-rw-r--r--packaging/initrd-recovery.spec44
-rw-r--r--src/system-recovery/50-system-recovery.list.m4.in3
-rw-r--r--src/system-recovery/recovery-headless.c98
-rw-r--r--src/system-recovery/recovery-init.in13
-rw-r--r--src/system-recovery/recovery-main.c121
-rw-r--r--src/system-recovery/recovery-rui.c47
-rw-r--r--src/system-recovery/system-recovery.h27
8 files changed, 192 insertions, 193 deletions
diff --git a/Makefile.am b/Makefile.am
index 8d90abc..086a7e7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -121,28 +121,30 @@ system_recovery_datadir = $(SYSTEM_RECOVERY_DATA_DIR)
system_recovery_imagedir = $(SYSTEM_RECOVERY_IMAGE_DIR)
system_recovery_libexecdir = $(SYSTEM_RECOVERY_LIBEXEC_DIR)
-if RECOVERY_GUI
system_recovery_SOURCES = \
- src/system-recovery/process-util.c \
- src/system-recovery/recovery-main.c \
- src/system-recovery/recovery-rui.c
+ src/system-recovery/recovery-main.c
system_recovery_CFLAGS = \
$(AM_CFLAGS) \
-DSYSTEM_RECOVERY_CONFIG_FILE=\""${system_recovery_datadir}/system-recovery.cfg"\" \
- -I $(librui_la_CFLAGS) \
- -I src/system-recovery
$(LIBCONFIG_CFLAGS) \
- -I $(top_srcdir)/src/librui \
-I $(top_srcdir)/src/system-recovery
system_recovery_LDADD = \
$(AM_LIBS) \
- $(LIBCONFIG_LIBS) \
- librui.la
+ $(LIBCONFIG_LIBS)
-system_recovery_libexec_PROGRAMS = \
- system-recovery
+if RECOVERY_GUI
+system_recovery_SOURCES += \
+ src/system-recovery/process-util.c \
+ src/system-recovery/recovery-rui.c
+
+system_recovery_CFLAGS += \
+ -I $(librui_la_CFLAGS) \
+ -I $(top_srcdir)/src/librui
+
+system_recovery_LDADD += \
+ librui.la
system_recovery_image_DATA = \
src/system-recovery/res/images/font.png \
@@ -152,8 +154,16 @@ system_recovery_image_DATA = \
initrd_recovery_install_dropin_DATA += \
src/system-recovery/50-system-recovery-sprd.list
+
+else
+
+system_recovery_SOURCES += \
+ src/system-recovery/recovery-headless.c
endif
+system_recovery_libexec_PROGRAMS = \
+ system-recovery
+
system_recovery_data_DATA = \
src/system-recovery/system-recovery.cfg
diff --git a/packaging/initrd-recovery.spec b/packaging/initrd-recovery.spec
index 14da98f..01636ec 100644
--- a/packaging/initrd-recovery.spec
+++ b/packaging/initrd-recovery.spec
@@ -98,19 +98,21 @@ popd
# common, wearable
pushd build_non_gui
%make_install
-mv %{buildroot}%{_libexecdir}/system-recovery/recovery-init \
- %{buildroot}%{_libexecdir}/system-recovery/recovery-init.non_gui
+mv %{buildroot}%{_libexecdir}/system-recovery/system-recovery \
+ %{buildroot}%{_libexecdir}/system-recovery/system-recovery.non_gui \
+
mv %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list \
- %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list.non_gui
+ %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery-non_gui.list
popd
# mobile
pushd build_gui
%make_install
-mv %{buildroot}%{_libexecdir}/system-recovery/recovery-init \
- %{buildroot}%{_libexecdir}/system-recovery/recovery-init.gui
+mv %{buildroot}%{_libexecdir}/system-recovery/system-recovery \
+ %{buildroot}%{_libexecdir}/system-recovery/system-recovery.gui \
+
mv %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list \
- %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list.gui
+ %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery-gui.list
popd
# reboot-param-helper
@@ -120,26 +122,6 @@ mkdir -p %{buildroot}%{_unitdir}/local-fs.target.wants
install -m 644 units/mnt-inform.mount %{buildroot}%{_unitdir}
ln -s ../mnt-inform.mount %{buildroot}%{_unitdir}/local-fs.target.wants
-%post -n system-recovery-non_gui
-ln -s %{_libexecdir}/system-recovery/recovery-init.non_gui \
- %{_libexecdir}/system-recovery/recovery-init
-mv %{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list.non_gui \
- %{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list
-%preun -n system-recovery-non_gui
-rm -f %{_libexecdir}/system-recovery/recovery-init
-mv %{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list \
- %{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list.non_gui
-
-%post -n system-recovery-gui
-ln -s %{_libexecdir}/system-recovery/recovery-init.gui \
- %{_libexecdir}/system-recovery/recovery-init
-mv %{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list.gui \
- %{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list
-%preun -n system-recovery-gui
-rm -f %{_libexecdir}/system-recovery/recovery-init
-mv %{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list \
- %{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list.gui
-
%posttrans
%{_libexecdir}/initrd-recovery/mkinitrd-recovery.sh
@@ -156,16 +138,16 @@ mv %{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list \
%defattr(-,root,root,-)
%manifest initrd-recovery.manifest
%{_datadir}/system-recovery/system-recovery.cfg
+%{_libexecdir}/system-recovery/recovery-init
%files -n system-recovery-non_gui
-%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list.non_gui
-%{_libexecdir}/system-recovery/recovery-init.non_gui
+%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery-non_gui.list
+%{_libexecdir}/system-recovery/system-recovery.non_gui
%files -n system-recovery-gui
-%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery.list.gui
+%{_datadir}/initrd-recovery/initrd.list.d/50-system-recovery-gui.list
%{_datadir}/system-recovery/res/images/*.png
-%{_libexecdir}/system-recovery/recovery-init.gui
-%{_libexecdir}/system-recovery/system-recovery
+%{_libexecdir}/system-recovery/system-recovery.gui
%files -n reboot-param-helper
%{_unitdir}/mnt-inform.mount
diff --git a/src/system-recovery/50-system-recovery.list.m4.in b/src/system-recovery/50-system-recovery.list.m4.in
index 177d474..2e2fd98 100644
--- a/src/system-recovery/50-system-recovery.list.m4.in
+++ b/src/system-recovery/50-system-recovery.list.m4.in
@@ -27,7 +27,7 @@ m4_ifdef(`RECOVERY_GUI',
/usr/share/system-recovery/res/images/menu-title.png
/usr/share/system-recovery/res/images/tizen-anim.png
/usr/share/system-recovery/res/images/warning.png')
-m4_ifdef(`RECOVERY_GUI', `@SYSTEM_RECOVERY_LIBEXEC_DIR@/system-recovery')
+m4_ifdef(`RECOVERY_GUI', `@SYSTEM_RECOVERY_LIBEXEC_DIR@/system-recovery.gui', `@SYSTEM_RECOVERY_LIBEXEC_DIR@/system-recovery.non_gui')
"
WITHLIBS="
@@ -45,6 +45,5 @@ WITHLIBS="
# LinkFileName:Target
SYMLINKS="
-/usr/bin/system-recovery:@SYSTEM_RECOVERY_LIBEXEC_DIR@/system-recovery
/sbin/recovery-init:@SYSTEM_RECOVERY_LIBEXEC_DIR@/recovery-init
"
diff --git a/src/system-recovery/recovery-headless.c b/src/system-recovery/recovery-headless.c
new file mode 100644
index 0000000..aa113f9
--- /dev/null
+++ b/src/system-recovery/recovery-headless.c
@@ -0,0 +1,98 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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 <libconfig.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <errno.h>
+
+#include "config.h"
+#include "log.h"
+#include "system-recovery.h"
+
+#include <asm-generic/setup.h> // for COMMAND_LINE_SIZE
+
+#define KERNEL_CMDLINE_KEY "tizen.recovery"
+
+static char *get_action_from_config(config_t *cfg)
+{
+ config_setting_t *node;
+ const char *action;
+
+ node = config_lookup(cfg, "headless_action");
+ if (!node)
+ return NULL;
+
+ action = config_setting_get_string(node);
+
+ return strdup(action);
+}
+
+// looks for tizen.recovery= key in kernel command line
+static char *get_action_from_cmdline(void)
+{
+ FILE *fp;
+ char cmdline[COMMAND_LINE_SIZE];
+ int len;
+
+ fp = fopen("/proc/cmdline", "r");
+ if (!fp)
+ return NULL;
+
+ char *p = fgets(cmdline, sizeof cmdline, fp);
+ fclose(fp);
+ if (!p)
+ return NULL;
+
+ const char *prefix = KERNEL_CMDLINE_KEY "=";
+ p = strstr(cmdline, prefix);
+ if (!p)
+ return NULL;
+ p += strlen(prefix);
+
+ for (len = 0; *(p + len) != 0 && !isspace(*(p + len)); ++len)
+ ; /* skip */
+
+ return strndup(p, len);
+}
+
+int recovery_headless(config_t *cfg)
+{
+ config_setting_t *node;
+
+ node = config_lookup(cfg, "action_handlers");
+ if (!node)
+ return -ENOENT;
+
+ char *action = get_action_from_cmdline();
+ if (!action)
+ action = get_action_from_config(cfg);
+ if (!action)
+ return -ENOENT;
+
+ const char *handler;
+ int r = config_setting_lookup_string(node, action, &handler);
+ free(action);
+
+ if (r == CONFIG_FALSE)
+ return -ENOENT;
+
+ return system(handler);
+}
diff --git a/src/system-recovery/recovery-init.in b/src/system-recovery/recovery-init.in
index 825073d..efa94a8 100644
--- a/src/system-recovery/recovery-init.in
+++ b/src/system-recovery/recovery-init.in
@@ -1,6 +1,7 @@
#!/bin/bash
-SYSTEM_RECOVERY="/usr/bin/system-recovery"
+[ "@RECOVERY_GUI@" = "GUI" ] && suffix=".gui" || suffix=".non_gui"
+SYSTEM_RECOVERY="@SYSTEM_RECOVERY_LIBEXEC_DIR@/system-recovery${suffix}"
FAKE_ROOT=/system
GREP="/usr/bin/grep"
@@ -100,13 +101,7 @@ mount_partitions
# For debugging - It should be deleted on Release
/sbin/agetty -l /bin/bash -n --keep-baud 115200,38400,9600 ttyS1 linux &
-if [ "z@RECOVERY_GUI@" == "zGUI" ]; then
- "$SYSTEM_RECOVERY"
-else
- $TOUCH ${FAKE_ROOT}/opt/.factoryreset
- if [ $? -ne 0 ]; then
- echo "Error: failed to put factory reset file flag."
- fi
-fi
+"${SYSTEM_RECOVERY}"
+
umount_partitions
do_reboot
diff --git a/src/system-recovery/recovery-main.c b/src/system-recovery/recovery-main.c
index d721fbd..f3bf4e0 100644
--- a/src/system-recovery/recovery-main.c
+++ b/src/system-recovery/recovery-main.c
@@ -33,115 +33,21 @@
#include <sys/types.h>
#include <sys/reboot.h>
-#include <asm-generic/setup.h> // for COMMAND_LINE_SIZE
-
#include <vconf/vconf-keys.h>
-#include "rui.h"
-#include "common.h"
-#include "graphics.h"
-#include "input-events.h"
-#include "process-util.h"
#include "system-recovery.h"
-#include "rui-progress-bar.h"
-
-bool volatile running = true;
-
-#define KERNEL_CMDLINE_KEY "tizen.recovery"
-
void sys_power_reboot(void)
{
reboot(RB_AUTOBOOT);
}
-#ifndef RECOVERY_GUI
-static char *get_action_from_config(config_t *cfg)
-{
- config_setting_t *node;
- const char *action;
-
- node = config_lookup(cfg, "headless_action");
- if (!node)
- return NULL;
-
- action = config_setting_get_string(node);
-
- return strdup(action);
-}
-
-// looks for tizen.recovery= key in kernel command line
-static char *get_action_from_cmdline(void)
-{
- FILE *fp;
- char cmdline[COMMAND_LINE_SIZE];
- int len;
-
- fp = fopen("/proc/cmdline", "r");
- if (!fp)
- return NULL;
-
- char *p = fgets(cmdline, sizeof cmdline, fp);
- fclose(fp);
- if (!p)
- return NULL;
-
- const char *prefix = KERNEL_CMDLINE_KEY "=";
- p = strstr(cmdline, prefix);
- if (!p)
- return NULL;
- p += strlen(prefix);
-
- for (len = 0; *(p + len) != 0 && !isspace(*(p + len)); ++len)
- ; /* skip */
-
- return strndup(p, len);
-}
-
-static int run_default(config_t *cfg)
-{
- config_setting_t *node;
- const char *action, *handler;
-
- node = config_lookup(cfg, "action_handlers");
- if (!node)
- return -ENOENT;
-
- action = get_action_from_cmdline();
- if (!action)
- action = get_action_from_config(cfg);
- if (!action)
- return -ENOENT;
-
- int r = config_setting_lookup_string(node, action, &handler);
- free(action);
-
- if (r == CONFIG_FALSE)
- return -ENOENT;
-
- return system(handler);
-}
-#endif
-
int main(void)
{
config_t cfg;
int ret;
LOGD("[main] recovery started.\n");
-#ifdef HAVE_TDM
- /* These should be set externally */
-
- /*
- * Under normal circumstances XDG_RUNTIME_DIR is set during
- * session setup (login). On initrd there is no session. This
- * is used in libwayland-server and there is no default value.
- */
- setenv("XDG_RUNTIME_DIR", "/run", 1);
-
- /* Tell TBM to work without an external wayland display manager. */
- setenv("TBM_DISPLAY_SERVER", "1", 1);
-#endif
config_init(&cfg);
ret = config_read_file(&cfg, SYSTEM_RECOVERY_CONFIG_FILE);
@@ -149,30 +55,15 @@ int main(void)
LOGD("Can't read config file");
return 1;
}
-#ifdef RECOVERY_GUI
- if (!recovery_rui_init(&cfg)) {
- LOGD("Can't initialize GUI.\n");
- return 1;
- }
-
- if (!ev_init()) {
- LOGD("Can't initialize input subsystem.\n");
- recovery_rui_exit();
- return 1;
- }
- rui_draw();
-
- while (running)
- if (!ev_dispatch(recovery_rui_input_callback))
- break;
-
- ev_exit();
- recovery_rui_exit();
+#ifdef RECOVERY_GUI
+ ret = recovery_gui(&cfg);
#else
- ret = run_default(&cfg);
+ ret = recovery_headless(&cfg);
#endif
+
LOGD("[main] recovery finished.\n");
config_destroy(&cfg);
- return 0;
+
+ return ret;
}
diff --git a/src/system-recovery/recovery-rui.c b/src/system-recovery/recovery-rui.c
index a2a5354..837d054 100644
--- a/src/system-recovery/recovery-rui.c
+++ b/src/system-recovery/recovery-rui.c
@@ -35,6 +35,13 @@
#include "system-recovery.h"
#include "rui-progress-bar.h"
#include "recovery-rui-skin.h"
+#include "process-util.h"
+
+bool volatile running = true;
+
+typedef enum {
+ RECOVERY_RUI_SCREEN_FACTORY_RUN = 4,
+} recovery_rui_screen_id;
void recovery_rui_input_callback(user_action action, user_action_type action_type)
{
@@ -726,3 +733,43 @@ void recovery_rui_exit(void)
free(rui_config_labels.rui_rulers);
free(rui_config_labels.rui_descriptions);
}
+
+
+int recovery_gui(config_t *cfg)
+{
+#ifdef HAVE_TDM
+ /* These should be set externally */
+
+ /*
+ * Under normal circumstances XDG_RUNTIME_DIR is set during
+ * session setup (login). On initrd there is no session. This
+ * is used in libwayland-server and there is no default value.
+ */
+ setenv("XDG_RUNTIME_DIR", "/run", 1);
+
+ /* Tell TBM to work without an external wayland display manager. */
+ setenv("TBM_DISPLAY_SERVER", "1", 1);
+#endif
+
+ if (!recovery_rui_init(cfg)) {
+ LOGD("Can't initialize GUI.\n");
+ return 1;
+ }
+
+ if (!ev_init()) {
+ LOGD("Can't initialize input subsystem.\n");
+ recovery_rui_exit();
+ return 1;
+ }
+
+ rui_draw();
+
+ while (running)
+ if (!ev_dispatch(recovery_rui_input_callback))
+ break;
+
+ ev_exit();
+ recovery_rui_exit();
+
+ return 0;
+}
diff --git a/src/system-recovery/system-recovery.h b/src/system-recovery/system-recovery.h
index ea8699e..5364c19 100644
--- a/src/system-recovery/system-recovery.h
+++ b/src/system-recovery/system-recovery.h
@@ -22,8 +22,6 @@
#include <stdio.h>
#include <stdbool.h>
-#include "input-events.h"
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -34,33 +32,12 @@ extern "C" {
#define ROOT_MOUNT_DIR "/system"
#define INITRD_MOUNT_DIR "/system/mnt/initrd-recovery"
-typedef enum {
- RECOVERY_RUI_SCREEN_MAIN,
- RECOVERY_RUI_SCREEN_REBOOT,
- RECOVERY_RUI_SCREEN_SAFE,
- RECOVERY_RUI_SCREEN_FACTORY,
- RECOVERY_RUI_SCREEN_FACTORY_RUN,
- RECOVERY_RUI_SCREEN_SD_RESTORE,
- RECOVERY_RUI_SCREEN_SD_RESTORE_RUN
-} recovery_rui_screen_id;
-
-typedef enum {
- RECOVERY_RUI_IMAGE_BACKGROUND_DEFAULT,
- RECOVERY_RUI_IMAGE_MENU_TITLE
-} recovery_rui_image_id;
-
-typedef enum {
- RECOVERY_RUI_ANIMATION_WORKING
-} recovery_rui_animation_id;
-
int pivot_root(const char *new_root, const char *put_old);
void sys_power_reboot(void);
-bool recovery_rui_init(config_t *cfg);
-void recovery_rui_exit(void);
-void recovery_rui_input_callback(user_action action,
- user_action_type action_type);
+int recovery_gui(config_t *cfg);
+int recovery_headless(config_t *cfg);
#ifdef __cplusplus
}