diff --git a/src/ttynvt.c b/src/ttynvt.c index 8627d92..8da2cd4 100644 --- a/src/ttynvt.c +++ b/src/ttynvt.c @@ -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,