Skip to content
Extraits de code Groupes Projets
Valider dc8d5b26 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

Merge branch 'env' into 'dev-kubat'

Resolve "Restart with current"

See merge request !94
parents 0cd8ff51 89ecd2c8
Aucune branche associée trouvée
Aucune étiquette associée trouvée
2 requêtes de fusion!95Process queue,!94Resolve "Restart with current"
...@@ -75,6 +75,9 @@ ...@@ -75,6 +75,9 @@
#define SELF_EXECUTABLE_FREEBSD "/proc/curproc/file" #define SELF_EXECUTABLE_FREEBSD "/proc/curproc/file"
#define SELF_EXECUTABLE_SOLARIS "/proc/self/path/a.out" #define SELF_EXECUTABLE_SOLARIS "/proc/self/path/a.out"
#define LKT_ENV_RESTART "__LKT_RESTART"
#define LKT_ENV_CURRENT "__LKT_CURRENT"
#define LKT_MAX_SQLITE_STATEMENT 1024 #define LKT_MAX_SQLITE_STATEMENT 1024
#define PROTECTED_DATABASE "disk" #define PROTECTED_DATABASE "disk"
......
...@@ -35,3 +35,7 @@ int config_new(volatile sqlite3 *db, const char *conf); ...@@ -35,3 +35,7 @@ int config_new(volatile sqlite3 *db, const char *conf);
/* Prints the default config file. */ /* Prints the default config file. */
void config_default(FILE *output); void config_default(FILE *output);
/* Manipulate Environment Variables */
#define env_set(var, val) setenv(var, val, 1)
#define env_get getenv
...@@ -23,12 +23,27 @@ inline bool ...@@ -23,12 +23,27 @@ inline bool
command_restart(struct lkt_state *srv, size_t c) command_restart(struct lkt_state *srv, size_t c)
{ {
const char *const argv[] = { executable_name, NULL }; const char *const argv[] = { executable_name, NULL };
struct lkt_queue_state sta = {0};
RETURN_UNLESS(lkt_client_auth(srv, c, false), "Failed to authentificate user", false); RETURN_UNLESS(lkt_client_auth(srv, c, false), "Failed to authentificate user", false);
if (!executable_name) { if (!executable_name) {
LOG_ERROR_SCT("GENERAL", "%s", "Can't restart if the executable path was not found at start-up"); LOG_ERROR_SCT("GENERAL", "%s", "Can't restart if the executable path was not found at start-up");
return false; return false;
} }
close(srv->fds[0].fd); close(srv->fds[0].fd);
database_queue_state(srv->db, &sta);
env_set(LKT_ENV_RESTART, "1");
int len = long_length(sta.current);
if (len > 0) {
char *pos = calloc(len, sizeof(char));
if (pos) {
safe_snprintf(pos, len, "%d", sta.current);
env_set(LKT_ENV_CURRENT, pos);
free(pos);
} else
LOG_WARN_SCT("GENERAL", "Failed to malloc, don't set %s to %d",
LKT_ENV_CURRENT, sta.current);
} else
env_set(LKT_ENV_CURRENT, "NULL");
database_close_all(); database_close_all();
execv(executable_name, (char *const *) argv); execv(executable_name, (char *const *) argv);
LOG_ERROR_SCT("GENERAL", "%s", "Failed to exec lektor or OS not supported"); LOG_ERROR_SCT("GENERAL", "%s", "Failed to exec lektor or OS not supported");
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <lektor/reg.h> #include <lektor/reg.h>
#include <lektor/database.h> #include <lektor/database.h>
#include <mthread/mthread.h> #include <mthread/mthread.h>
#include <lektor/commands.h>
#include <assert.h> #include <assert.h>
#include <signal.h> #include <signal.h>
...@@ -67,6 +68,8 @@ main(int argc, char *argv[]) ...@@ -67,6 +68,8 @@ main(int argc, char *argv[])
normal_launch: normal_launch:
LOG_INFO_SCT("GENERAL", "Lektor launched by user %s (shell: %s, home: %s)", LOG_INFO_SCT("GENERAL", "Lektor launched by user %s (shell: %s, home: %s)",
pw->pw_name, pw->pw_shell, pw->pw_dir); pw->pw_name, pw->pw_shell, pw->pw_dir);
if (env_get(LKT_ENV_RESTART))
LOG_INFO_SCT("GENERAL", "%s", "Lektord has been restarted");
reg_set(server_reg); reg_set(server_reg);
mthread_init(); mthread_init();
pthread_create(&th, NULL, mthread_main, NULL); pthread_create(&th, NULL, mthread_main, NULL);
...@@ -114,11 +117,12 @@ normal_launch: ...@@ -114,11 +117,12 @@ normal_launch:
srv.kara_prefix = kara_dir; srv.kara_prefix = kara_dir;
database_config_queue_default(srv.db); database_config_queue_default(srv.db);
if (autoclear) if (!env_get(LKT_ENV_RESTART) && autoclear)
database_queue_clear(srv.db); database_queue_clear(srv.db);
RETURN_IF(load_module_by_name(&srv, "player", &srv.win), "Can't load module player", 3); RETURN_IF(load_module_by_name(&srv, "player", &srv.win), "Can't load module player", 3);
RETURN_IF(load_module_by_name(&srv, "repo", &srv.repo), "Can't load module repo", 3); RETURN_IF(load_module_by_name(&srv, "repo", &srv.repo), "Can't load module repo", 3);
lkt_listen(&srv); lkt_listen(&srv);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
...@@ -727,6 +727,15 @@ lkt_listen(struct lkt_state *srv) ...@@ -727,6 +727,15 @@ lkt_listen(struct lkt_state *srv)
srv->fds[0].events = POLLIN; srv->fds[0].events = POLLIN;
srv->fds_len = 1; srv->fds_len = 1;
/* Get ENV */
/* Not working -> race condition with player module */
// char *env_current = env_get(LKT_ENV_CURRENT);
// if (env_current && !STR_MATCH(env_current, "NULL")) {
// LOG_INFO_SCT("INIT", "Restart playback from %s", env_current);
// command_play(srv->db, &srv->win, &env_current, &srv->mpd_idle_events);
// }
/* Listen */
for (;;) { for (;;) {
if (handle_network_events(srv) < 0) if (handle_network_events(srv) < 0)
break; break;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter