diff --git a/client.c b/client.c index dce4138..cd25924 100644 --- a/client.c +++ b/client.c @@ -123,30 +123,59 @@ static int client_mainloop(void) { debug("client-stdin: %c\n", pkt.u.msg[0]); if (client.await_command) { client.await_command = false; - int rv = 0; + bool detach = false; switch (pkt.u.msg[0]) { case 'd': - rv = RV_DETACH; + server.next_session = "\0"; + detach = true; break; case '0': + server.next_session = "0"; + detach = true; + break; case '1': + server.next_session = "1"; + detach = true; + break; case '2': + server.next_session = "2"; + detach = true; + break; case '3': + server.next_session = "3"; + detach = true; + break; case '4': + server.next_session = "4"; + detach = true; + break; case '5': + server.next_session = "5"; + detach = true; + break; case '6': + server.next_session = "6"; + detach = true; + break; case '7': + server.next_session = "7"; + detach = true; + break; case '8': + server.next_session = "8"; + detach = true; + break; case '9': - rv = RV_DETACH-(int)(pkt.u.msg[0]-'0')-1; + server.next_session = "9"; + detach = true; break; } - if (rv != 0) { + if (detach) { pkt.type = MSG_DETACH; pkt.len = 0; client_send_packet(&pkt); close(server.socket); - return rv; + return RV_DETACH; } } pkt.len = len; @@ -159,6 +188,7 @@ static int client_mainloop(void) { } } else if (len == 0) { debug("client-stdin: EOF\n"); + server.next_session = "\0"; return RV_DETACH; } } diff --git a/splex.c b/splex.c index 082825f..44e513a 100644 --- a/splex.c +++ b/splex.c @@ -62,7 +62,10 @@ #define countof(arr) (sizeof(arr) / sizeof((arr)[0])) -#define RV_DETACH -1000 +#define RV_DETACH -1 + +char* splex_session_names = "0123456789"; +char* shell_cmd[2] = { "/bin/bash", NULL }; enum PacketType { MSG_CONTENT = 0, @@ -119,6 +122,7 @@ typedef struct { const char *session_name; char host[255]; bool read_pty; + const char *next_session; } Server; static Server server = { .running = true, .exit_status = -1, .host = "@localhost" }; @@ -534,7 +538,7 @@ static bool attach_session(const char *name, const bool terminate) { client_setup_terminal(); int status = client_mainloop(); client_restore_terminal(); - if (status < RV_DETACH) { + if (status == RV_DETACH) { info("detached with return value %d", status); } else if (status == -EIO) { info("exited due to I/O errors"); @@ -547,6 +551,70 @@ static bool attach_session(const char *name, const bool terminate) { return terminate; } +static bool set_next_session() { + char* siter = splex_session_names; + info("siter %x\n",siter); + char sname[] = "\0"; + while (*siter != '\0') { + sname[0] = *siter; + if (session_alive(sname)) + break; + siter++; + } + info("*siter %c\n",*siter); + if (*siter == '\0') + return false; + server.next_session = sname; + return true; +} + +static bool session_loop() { + // Set initial session, or create a new one + if (!set_next_session()) { + server.next_session = "0"; + } + // printf("%s\n",server.session_name); + while (true) { + info("Iteration with session %s\n",server.next_session); + server.session_name = server.next_session; + if (!session_alive(server.session_name)) + if (!create_session(server.session_name, shell_cmd)) + die("create-session"); + if (server.socket > 0) + close(server.socket); + if ((server.socket = session_connect(server.session_name)) == -1) + return false; + if (server_set_socket_non_blocking(server.socket) == -1) + return false; + + struct sigaction sa; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sa.sa_handler = client_sigwinch_handler; + sigaction(SIGWINCH, &sa, NULL); + sa.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &sa, NULL); + + client_setup_terminal(); + int status = client_mainloop(); + client_restore_terminal(); + + if (status == -EIO) { + info("exited due to I/O errors"); + exit(-EIO); + } else if (status == RV_DETACH) { + info("detached with return value %d and next session %s", status, server.next_session); + if (server.next_session[0] == '\0') { + exit(EXIT_SUCCESS); + } + } else { + info("session terminated with exit status %d", status); + if (!set_next_session()) + exit(EXIT_SUCCESS); + } + } +} + static int session_filter(const struct dirent *d) { return strstr(d->d_name, server.host) != NULL; } @@ -709,12 +777,13 @@ int main(int argc, char *argv[]) { } break; case 't': - if (!session_alive(server.session_name)) { - if (!create_session(server.session_name, cmd)) - die("create-session"); - } - if (!attach_session(server.session_name, true)) - die("attach-session"); + session_loop(); + /* if (!session_alive(server.session_name)) { */ + /* if (!create_session(server.session_name, cmd)) */ + /* die("create-session"); */ + /* } */ + /* if (!attach_session(server.session_name, true)) */ + /* die("attach-session"); */ break; }