diff --git a/src/bin/base_gui.c b/src/bin/base_gui.c index 25e743c..9c49e08 100644 --- a/src/bin/base_gui.c +++ b/src/bin/base_gui.c @@ -266,7 +266,7 @@ void base_gui_term(void) { base_data *bd = g_bd; - EINA_SAFETY_ON_NULL_RETURN(bd); + if (!bd) return; ecore_timer_del(bd->edc_navi_update_timer); file_browser_term(); diff --git a/src/bin/config_data.c b/src/bin/config_data.c index 1c6836e..d1c0573 100644 --- a/src/bin/config_data.c +++ b/src/bin/config_data.c @@ -94,19 +94,22 @@ static void config_save(config_data *cd) { char buf[PATH_MAX]; + const char *config_home = efreet_config_home_get(); + if (!config_home) return; //Create config home directory if it doesn't exist. - if (!ecore_file_exists(efreet_config_home_get())) + if (!ecore_file_exists(config_home)) { - Eina_Bool success = ecore_file_mkdir(efreet_config_home_get()); + Eina_Bool success = ecore_file_mkdir(config_home); if (!success) { - EINA_LOG_ERR(_("Cannot create a config folder \"%s\""), efreet_config_home_get()); + EINA_LOG_ERR(_("Cannot create a config folder \"%s\""), + config_home); return; } } - snprintf(buf, sizeof(buf), "%s/enventor", efreet_config_home_get()); + snprintf(buf, sizeof(buf), "%s/enventor", config_home); //Create enventor config folder if it doesn't exist. if (!ecore_file_exists(buf)) @@ -114,14 +117,14 @@ config_save(config_data *cd) Eina_Bool success = ecore_file_mkdir(buf); if (!success) { - EINA_LOG_ERR(_("Cannot create a config folder \"%s\""), buf); + EINA_LOG_ERR(_("Cannot create a enventor config folder \"%s\""), + buf); return; } } //Save config file. - snprintf(buf, sizeof(buf), "%s/enventor/config.eet", - efreet_config_home_get()); + snprintf(buf, sizeof(buf), "%s/enventor/config.eet", config_home); Eet_File *ef = eet_open(buf, EET_FILE_MODE_WRITE); if (!ef) { @@ -395,6 +398,7 @@ void config_term(void) { config_data *cd = g_cd; + if (!cd) return; config_save(cd); diff --git a/src/bin/file_mgr.c b/src/bin/file_mgr.c index 3f6a911..0e9ab1b 100644 --- a/src/bin/file_mgr.c +++ b/src/bin/file_mgr.c @@ -228,7 +228,7 @@ void file_mgr_term(void) { file_mgr_data *fmd = g_fmd; - EINA_SAFETY_ON_NULL_RETURN(fmd); + if (!fmd) return; free(fmd); } diff --git a/src/bin/live_edit.c b/src/bin/live_edit.c index 7aa1a80..d3e9a20 100644 --- a/src/bin/live_edit.c +++ b/src/bin/live_edit.c @@ -2345,7 +2345,7 @@ void live_edit_term(void) { live_data *ld = g_ld; - EINA_SAFETY_ON_NULL_RETURN(ld); + if (!ld) return; live_edit_cancel(EINA_FALSE); diff --git a/src/bin/main.c b/src/bin/main.c index 71966e0..aad8b7a 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -13,6 +13,8 @@ typedef struct app_s Eina_Bool lazy_save : 1; } app_data; +static Eina_Bool own_lock = EINA_FALSE; //lock file owner? + int main(int argc, char **argv); static void @@ -912,6 +914,150 @@ keygrabber_init(app_data *ad) GRAB_ADD("Down", modifier); } +static Eina_Bool +enventor_lock_create(void) +{ + const char *config_home = efreet_config_home_get(); + + //Exception 1 + //Create config home directory if it doesn't exist. + if (!config_home) + { + EINA_LOG_ERR("No config home directory?! = %s", config_home); + return EINA_TRUE; + } + + //Exception 2 + //Create config home directory if it doesn't exist. + if (!ecore_file_exists(config_home)) + { + Eina_Bool success = ecore_file_mkdir(efreet_config_home_get()); + if (!success) + { + EINA_LOG_ERR(_("Cannot create a config folder \"%s\""), + config_home); + return EINA_TRUE; + } + } + + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/enventor", config_home); + + //Exception 3 + //Create enventor config folder if it doesn't exist. + if (!ecore_file_exists(buf)) + { + Eina_Bool success = ecore_file_mkdir(buf); + if (!success) + { + EINA_LOG_ERR(_("Cannot create a enventor config folder \"%s\""), + buf); + return EINA_TRUE; + } + } + + snprintf(buf, sizeof(buf), "%s/enventor/"ENVENTOR_LOCK_FILE, config_home); + + //Is there any other Enventor instance? + if (ecore_file_exists(buf)) + { + fprintf(stdout, "Enventor program is already running!\n\n" + "If you are really stuck in launching enventor due to " + "this,\nTry removing a file \"%s\"\n", buf); + return EINA_FALSE; + } + + //Ok, this is an unique instance! + FILE *fp = fopen(buf, "w"); + if (!fp) + { + EINA_LOG_ERR("Failed to open file \"%s\"", buf); + return EINA_TRUE; + } + fputs("x", fp); + fclose(fp); + + own_lock = EINA_TRUE; + + return EINA_TRUE; +} + +static void +enventor_lock_remove() +{ + //You are not the owner of the lock. + if (!own_lock) return; + + const char *config_home = efreet_config_home_get(); + //Create config home directory if it doesn't exist. + if (!config_home || !ecore_file_exists(config_home)) + { + EINA_LOG_ERR("No config home directory?! = %s", config_home); + return; + } + + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/enventor/"ENVENTOR_LOCK_FILE, + efreet_config_home_get()); + + //Just in case. + if (!ecore_file_exists(buf)) + { + EINA_LOG_ERR("No enventor lock file?! = %s", buf); + return; + } + + ecore_file_remove(buf); +} + +static void +crash_handler(int x EINA_UNUSED, siginfo_t *info EINA_UNUSED, + void *data EINA_UNUSED) +{ + EINA_LOG_ERR("Eeeek! Eventor is terminated abnormally!"); + enventor_lock_remove(); +} + +static void +sigaction_setup(void) +{ + //Just in case, if you are debugging using gdb, + //you can send signals like this. "handle SIGABRT pass" + //Use this for remove the enventor lock. + + struct sigaction action; + + memset(&action, 0x0, sizeof(action)); + action.sa_handler = SIG_DFL; + action.sa_sigaction = crash_handler; + action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO; + sigemptyset(&action.sa_mask); + + //Bus error (bad memory access) + sigaction(SIGBUS, &action, NULL); + + //Floating pointer exception + sigaction(SIGFPE, &action, NULL); + + //Illegal Instruction + sigaction(SIGILL, &action, NULL); + + //Invalid memory reference + sigaction(SIGSEGV, &action, NULL); + + //Kill + sigaction(SIGKILL, &action, NULL); + + //Abort + sigaction(SIGABRT, &action, NULL); + + //Stop + sigaction(SIGSTOP, &action, NULL); + + //Interrupt from keyboard +// sigaction(SIGINT, &action, NULL); +} + static Eina_Bool init(app_data *ad, int argc, char **argv) { @@ -922,9 +1068,12 @@ init(app_data *ad, int argc, char **argv) #endif /* set locale */ elm_setup(); - enventor_init(argc, argv); + if (!enventor_lock_create()) return EINA_FALSE; + sigaction_setup(); + + Eina_Bool template = EINA_FALSE; Eina_Bool default_edc = EINA_TRUE; if (!config_data_set(argc, argv, &default_edc, &template)) @@ -967,6 +1116,7 @@ term(void) base_gui_term(); file_mgr_term(); config_term(); + enventor_lock_remove(); enventor_shutdown(); } diff --git a/src/bin/statusbar.c b/src/bin/statusbar.c index 9babdf6..08fb1f2 100644 --- a/src/bin/statusbar.c +++ b/src/bin/statusbar.c @@ -383,7 +383,7 @@ void stats_term(void) { stats_data *sd = g_sd; - EINA_SAFETY_ON_NULL_RETURN(sd); + if (!sd) return; eina_stringshare_del(sd->group_name); free(sd); diff --git a/src/bin/tools.c b/src/bin/tools.c index fb49677..08fcdd3 100644 --- a/src/bin/tools.c +++ b/src/bin/tools.c @@ -178,7 +178,7 @@ void tools_term(void) { tools_data *td = g_td; - assert(td); + if (!td) return; free(td); } diff --git a/src/include/common.h b/src/include/common.h index 546e308..50e16f9 100644 --- a/src/include/common.h +++ b/src/include/common.h @@ -99,5 +99,6 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" #define NGETTEXT(single, plur, n) (((n)==1)? (single):(plur)) #endif /* localization */ +#define ENVENTOR_LOCK_FILE ".enventor.lock" #endif