diff options
author | Karol Lewandowski <k.lewandowsk@samsung.com> | 2017-09-29 10:58:03 +0200 |
---|---|---|
committer | Karol Lewandowski <k.lewandowsk@samsung.com> | 2017-09-29 12:32:50 +0200 |
commit | b8e88cebfe9dc0e143d98b6bdf71466ba9a085ca (patch) | |
tree | cf48ca4527e7e43e02d4ba7463419cddd3d001d7 | |
parent | 8be23e75bc33f969b46ed502e8a927058c0a33f3 (diff) | |
download | initrd-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.am | 32 | ||||
-rw-r--r-- | packaging/initrd-recovery.spec | 44 | ||||
-rw-r--r-- | src/system-recovery/50-system-recovery.list.m4.in | 3 | ||||
-rw-r--r-- | src/system-recovery/recovery-headless.c | 98 | ||||
-rw-r--r-- | src/system-recovery/recovery-init.in | 13 | ||||
-rw-r--r-- | src/system-recovery/recovery-main.c | 121 | ||||
-rw-r--r-- | src/system-recovery/recovery-rui.c | 47 | ||||
-rw-r--r-- | src/system-recovery/system-recovery.h | 27 |
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 } |