diff --git a/src/kmscon_conf.c b/src/kmscon_conf.c index e49c8f8..182fdf0 100644 --- a/src/kmscon_conf.c +++ b/src/kmscon_conf.c @@ -120,6 +120,9 @@ static void print_help() "\t --grab-terminal-new [Return]\n" "\t Create new terminal session\n" "\n" + "Session Options:\n" + "\t --session-max [50] Maximum number of sessions\n" + "\n" "Font Options:\n" "\t --font-engine [pango]\n" "\t Font engine\n" @@ -298,6 +301,7 @@ struct conf_option options[] = { CONF_OPTION_UINT(0, "font-size", NULL, &kmscon_conf.font_size, 12), CONF_OPTION_STRING(0, "font-name", NULL, &kmscon_conf.font_name, "monospace"), CONF_OPTION_UINT(0, "font-dpi", NULL, &kmscon_conf.font_ppi, 96), + CONF_OPTION_UINT(0, "session-max", NULL, &kmscon_conf.session_max, 50), CONF_OPTION_STRING_LIST(0, "seats", aftercheck_seats, &kmscon_conf.seats, def_seats), }; diff --git a/src/kmscon_conf.h b/src/kmscon_conf.h index 6abb1da..d0a4430 100644 --- a/src/kmscon_conf.h +++ b/src/kmscon_conf.h @@ -94,6 +94,9 @@ struct kmscon_conf_t { char **seats; bool all_seats; + /* sessions */ + unsigned int session_max; + /* font engine */ char *font_engine; /* font size */ diff --git a/src/kmscon_seat.c b/src/kmscon_seat.c index 077acea..2178226 100644 --- a/src/kmscon_seat.c +++ b/src/kmscon_seat.c @@ -73,6 +73,7 @@ struct kmscon_seat { struct uterm_vt *vt; struct shl_dlist displays; + size_t session_count; struct shl_dlist sessions; struct kmscon_session *cur_sess; struct kmscon_session *dummy; @@ -560,6 +561,13 @@ int kmscon_seat_register_session(struct kmscon_seat *seat, if (!seat || !out) return -EINVAL; + if (kmscon_conf.session_max && + seat->session_count >= kmscon_conf.session_max) { + log_warning("maximum number of sessions reached (%d), dropping new session", + kmscon_conf.session_max); + return -EOVERFLOW; + } + sess = malloc(sizeof(*sess)); if (!sess) { log_error("cannot allocate memory for new session on seat %s", @@ -576,6 +584,7 @@ int kmscon_seat_register_session(struct kmscon_seat *seat, sess->data = data; shl_dlist_link_tail(&seat->sessions, &sess->list); + ++seat->session_count; *out = sess; shl_dlist_for_each(iter, &seat->displays) { @@ -612,6 +621,7 @@ void kmscon_session_unregister(struct kmscon_session *sess) session_deactivate(sess); shl_dlist_unlink(&sess->list); + --sess->seat->session_count; sess->seat = NULL; session_call(sess, KMSCON_SESSION_UNREGISTER, NULL); }