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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user