#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
-#include <sys/queue.h>
#if defined(__OpenBSD__) || defined(__APPLE__)
#include <util.h>
return len > 0 && strcasecmp(buf, host_buf) == 0;
}
-void
-tty_client_remove(struct tty_client *client) {
- struct tty_client *iterator;
- LIST_FOREACH(iterator, &server->clients, list) {
- if (iterator == client) {
- LIST_REMOVE(iterator, list);
- server->client_count--;
- break;
- }
- }
-}
-
void
tty_client_destroy(struct tty_client *client) {
- if (!client->running || client->pid <= 0)
+ if (client->pid <= 0)
goto cleanup;
- client->running = false;
-
// kill process (group) and free resource
int pgid = getpgid(client->pid);
int pid = pgid > 0 ? -pgid : client->pid;
- lwsl_notice("sending %s (%d) to process (group) %d\n", server->sig_name, server->sig_code, pid);
if (kill(pid, server->sig_code) != 0) {
+ if (errno == ESRCH)
+ goto cleanup;
lwsl_err("kill: %d, errno: %d (%s)\n", pid, errno, strerror(errno));
}
- pid_t pid_out;
- client->exit_status = wait_proc(client->pid, &pid_out);
- if (pid_out > 0) {
- lwsl_notice("process exited with code %d, pid: %d\n", client->exit_status, pid_out);
- }
- close(client->pty);
cleanup:
uv_read_stop((uv_stream_t *) &client->pipe);
+ close(client->pty);
+
// free the buffer
if (client->buffer != NULL)
free(client->buffer);
for (int i = 0; i < client->argc; i++) {
free(client->args[i]);
}
-
- // remove from client list
- tty_client_remove(client);
}
void
lwsl_notice("started process, pid: %d\n", pid);
client->pid = pid;
client->pty = pty;
- client->running = true;
if (client->size.ws_row > 0 && client->size.ws_col > 0)
ioctl(client->pty, TIOCSWINSZ, &client->size);
break;
case LWS_CALLBACK_ESTABLISHED:
- client->running = false;
client->initialized = false;
client->initial_cmd_index = 0;
client->authenticated = false;
}
}
- LIST_INSERT_HEAD(&server->clients, client, list);
server->client_count++;
lws_hdr_copy(wsi, buf, sizeof(buf), WSI_TOKEN_GET_URI);
break;
case LWS_CALLBACK_CLOSED:
+ server->client_count--;
lwsl_notice("WS closed from %s, clients: %d\n", client->address, server->client_count);
tty_client_destroy(client);
if (server->once && server->client_count == 0) {
ts = xmalloc(sizeof(struct tty_server));
memset(ts, 0, sizeof(struct tty_server));
- LIST_INIT(&ts->clients);
ts->client_count = 0;
ts->sig_code = SIGHUP;
sprintf(ts->terminal_type, "%s", "xterm-256color");
status = wait_proc(-1, &pid);
if (pid > 0) {
lwsl_notice("process exited with code %d, pid: %d\n", status, pid);
- struct tty_client *iterator;
- LIST_FOREACH(iterator, &server->clients, list) {
- if (iterator->pid == pid) {
- iterator->running = false;
- iterator->exit_status = status;
- break;
- }
- }
}
return;
default: