Lines Matching refs:session

39  *   OK       - session is up and running
40 * RECONFIG - session is pending for reconfiguration,
41 * new values are already loaded in session object
42 * KILL - session is pending to be killed
48 * - reads config file and setup session objects
52 * RECONFIG - session needs to be changed
54 * KILL - session needs to be killed
55 * (session is no longer in config file)
58 * - scans session objects and does following actions
62 * RECONFIG - session is killed and re-run with new config
63 * KILL - session is killed
117 struct daemon_session *session = zalloc(sizeof(*session));
119 if (!session)
122 session->name = strdup(name);
123 if (!session->name) {
124 free(session);
128 session->pid = -1;
129 list_add_tail(&session->list, &config->sessions);
130 return session;
135 struct daemon_session *session;
137 list_for_each_entry(session, &daemon->sessions, list) {
138 if (!strcmp(session->name, name))
139 return session;
145 static int get_session_name(const char *var, char *session, int len)
147 const char *p = var + sizeof("session-") - 1;
150 *session++ = *p++;
152 *session = 0;
158 struct daemon_session *session;
170 session = daemon__find_session(daemon, name);
172 if (!session) {
173 /* New session is defined. */
174 session = daemon__add_session(daemon, name);
175 if (!session)
178 pr_debug("reconfig: found new session %s\n", name);
181 session->state = RECONFIG;
182 } else if (session->state == KILL) {
183 /* Current session is defined, no action needed. */
184 pr_debug("reconfig: found current session %s\n", name);
185 session->state = OK;
191 if (session->run)
192 same = !strcmp(session->run, value);
195 if (session->run) {
196 zfree(&session->run);
197 pr_debug("reconfig: session %s is changed\n", name);
200 session->run = strdup(value);
201 if (!session->run)
206 * trigger reconfig for the session.
208 session->state = RECONFIG;
219 if (strstarts(var, "session-")) {
298 struct daemon_session *session;
308 list_for_each_entry(session, &daemon->sessions, list)
309 session->state = KILL;
320 static int daemon_session__run(struct daemon_session *session,
327 if (asprintf(&session->base, "%s/session-%s",
328 daemon->base, session->name) < 0) {
333 if (mkdir(session->base, 0755) && errno != EEXIST) {
338 session->start = time(NULL);
340 session->pid = fork();
341 if (session->pid < 0)
343 if (session->pid > 0) {
344 pr_info("reconfig: ruining session [%s:%d]: %s\n",
345 session->name, session->pid, session->run);
349 if (chdir(session->base)) {
365 perror("failed: open session output");
384 daemon->perf, SESSION_CONTROL, SESSION_ACK, session->run);
396 struct daemon_session *session;
414 list_for_each_entry(session, &daemon->sessions, list) {
415 if (session->pid == -1)
418 pid = waitpid(session->pid, &status, WNOHANG);
423 pr_info("session '%s' exited, status=%d\n",
424 session->name, WEXITSTATUS(status));
426 pr_info("session '%s' killed (signal %d)\n",
427 session->name, WTERMSIG(status));
429 pr_info("session '%s' stopped (signal %d)\n",
430 session->name, WSTOPSIG(status));
432 pr_info("session '%s' Unexpected status (0x%x)\n",
433 session->name, status);
436 session->state = KILL;
437 session->pid = -1;
443 static int daemon_session__wait(struct daemon_session *session, struct daemon *daemon,
466 } while (session->pid != -1);
473 struct daemon_session *session;
475 list_for_each_entry(session, &daemon->sessions, list) {
476 if (session->pid != -1)
510 static int daemon_session__control(struct daemon_session *session,
523 session->base, SESSION_CONTROL);
532 session->base, SESSION_ACK);
667 static int daemon_session__ping(struct daemon_session *session)
669 return daemon_session__control(session, "ping", true) ? PING_FAIL : PING_OK;
675 struct daemon_session *session;
692 /* session up time */
708 list_for_each_entry(session, &daemon->sessions, list) {
712 session->pid,
714 csv_sep, session->name,
716 csv_sep, session->run);
719 /* session dir */
720 csv_sep, session->base,
721 /* session output */
722 csv_sep, session->base, SESSION_OUTPUT);
725 /* session control */
726 csv_sep, session->base, SESSION_CONTROL,
727 /* session ack */
728 csv_sep, session->base, SESSION_ACK);
731 /* session up time */
732 csv_sep, (curr - session->start) / 60);
737 session->pid, session->name, session->run);
741 session->base);
743 session->base, SESSION_OUTPUT);
745 session->base, SESSION_CONTROL);
747 session->base, SESSION_ACK);
749 (curr - session->start) / 60);
756 static int daemon_session__signal(struct daemon_session *session, int sig)
758 if (session->pid < 0)
760 return kill(session->pid, sig);
765 struct daemon_session *session;
770 list_for_each_entry(session, &daemon->sessions, list) {
771 if (all || !strcmp(cmd->signal.name, session->name)) {
772 daemon_session__signal(session, cmd->signal.sig);
773 fprintf(out, "signal %d sent to session '%s [%d]'\n",
774 cmd->signal.sig, session->name, session->pid);
788 struct daemon_session *session;
793 list_for_each_entry(session, &daemon->sessions, list) {
794 if (all || !strcmp(cmd->ping.name, session->name)) {
795 int state = daemon_session__ping(session);
797 fprintf(out, "%-4s %s\n", ping_str[state], session->name);
891 static void daemon_session__kill(struct daemon_session *session,
899 daemon_session__control(session, "stop", false);
902 daemon_session__signal(session, SIGTERM);
905 daemon_session__signal(session, SIGKILL);
908 pr_err("failed to wait for session %s\n",
909 session->name);
914 } while (daemon_session__wait(session, daemon, 10));
919 struct daemon_session *session;
921 list_for_each_entry(session, &daemon->sessions, list)
922 daemon_session__signal(session, sig);
925 static void daemon_session__delete(struct daemon_session *session)
927 zfree(&session->base);
928 zfree(&session->name);
929 zfree(&session->run);
930 free(session);
933 static void daemon_session__remove(struct daemon_session *session)
935 list_del(&session->list);
936 daemon_session__delete(session);
941 struct daemon_session *session;
943 list_for_each_entry(session, &daemon->sessions, list)
944 daemon_session__control(session, "stop", false);
973 struct daemon_session *session, *h;
975 list_for_each_entry_safe(session, h, &daemon->sessions, list)
976 daemon_session__remove(session);
985 struct daemon_session *session, *n;
987 list_for_each_entry_safe(session, n, &daemon->sessions, list) {
989 if (session->state == OK)
992 /* Remove session. */
993 if (session->state == KILL) {
994 if (session->pid > 0) {
995 daemon_session__kill(session, daemon);
996 pr_info("reconfig: session '%s' killed\n", session->name);
998 daemon_session__remove(session);
1002 /* Reconfig session. */
1003 if (session->pid > 0) {
1004 daemon_session__kill(session, daemon);
1005 pr_info("reconfig: session '%s' killed\n", session->name);
1007 if (daemon_session__run(session, daemon))
1010 session->state = OK;
1419 OPT_STRING(0, "session", &name, "session",
1420 "Sent signal to specific session"),
1471 OPT_STRING(0, "session", &name, "session",
1472 "Ping to specific session"),