ttynvt: Optionally add delay during close

Optionally "Give network and remote end some time to close the
connection".

More or less like suggested by Jo Luxer:
https://gitlab.com/lars-thrane-as/ttynvt/-/merge_requests/4
This commit is contained in:
Kim Woelders
2023-02-12 08:03:29 +01:00
parent 8bf4b7705d
commit ad077571f8
+31
View File
@@ -46,9 +46,11 @@ static struct ttynvt_param {
unsigned int quiet;
unsigned int debug;
int logstd;
const char *close_delay;
/* Derived */
char host[64];
unsigned int port;
unsigned int close_delay_us;
/* Picked up */
int foreground;
} ttynvt_param;
@@ -115,6 +117,20 @@ static void ttynvt_interrupted(fuse_req_t req, void *data)
pthread_kill(thread, SIGUSR2);
}
static void _ttynvt_sleep_us(unsigned int tus)
{
struct timespec ts;
ts.tv_sec = tus / 1000000;
tus -= ts.tv_sec * 1000000;
ts.tv_nsec = tus * 1000;
while (nanosleep(&ts, &ts))
;
}
static int _check_dev(void)
{
int rc;
@@ -1128,6 +1144,9 @@ static void ttynvt_release(fuse_req_t req, struct fuse_file_info *info)
pthread_mutex_destroy(&tty->tty_lock);
pthread_mutex_destroy(&tty->poll_lock);
if (ttynvt_param.close_delay_us)
_ttynvt_sleep_us(ttynvt_param.close_delay_us);
_fd_close(tty->fds[FD_NET].fd);
_fd_close(tty->fds[FD_MASTER].fd);
_fd_close(tty->fds[FD_SLAVE].fd);
@@ -1167,6 +1186,7 @@ static const struct fuse_opt ttynvt_opts[] = {
TTYNET_OPT("-n %s", dev_name, 0),
TTYNET_OPT("--name=%s", dev_name, 0),
TTYNET_OPT("-q", quiet, 1),
TTYNET_OPT("-s %s", close_delay, 0),
TTYNET_OPT("-S %s", server, 0),
TTYNET_OPT("--server=%s", server, 0),
FUSE_OPT_KEY("-h", 0),
@@ -1186,6 +1206,7 @@ static void print_help(void)
"\t-n name, --name=name (default: ttyNVT0)\n"
"\t\tDevice will be created in /dev/$name.\n"
"\t-q\t\tBe quiet (suppress informational messages)\n"
"\t-s delay \t\tDelay at close in ms (use u suffix for us)\n"
"\t-S server, --server=host:port\n");
}
@@ -1250,6 +1271,16 @@ int main(int argc, char *argv[])
snprintf(dev_name, sizeof(dev_name), "DEVNAME=%s", ttynvt_param.dev_name);
if (ttynvt_param.close_delay)
{
char ch = 'm';
sscanf(ttynvt_param.close_delay, "%u%c",
&ttynvt_param.close_delay_us, &ch);
if (ch != 'u')
ttynvt_param.close_delay_us *= 1000; // To milliseconds
}
struct cuse_info ci = {
.dev_major = ttynvt_param.major,
.dev_minor = ttynvt_param.minor,