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 quiet;
|
||||||
unsigned int debug;
|
unsigned int debug;
|
||||||
int logstd;
|
int logstd;
|
||||||
|
const char *close_delay;
|
||||||
/* Derived */
|
/* Derived */
|
||||||
char host[64];
|
char host[64];
|
||||||
unsigned int port;
|
unsigned int port;
|
||||||
|
unsigned int close_delay_us;
|
||||||
/* Picked up */
|
/* Picked up */
|
||||||
int foreground;
|
int foreground;
|
||||||
} ttynvt_param;
|
} ttynvt_param;
|
||||||
@@ -115,6 +117,20 @@ static void ttynvt_interrupted(fuse_req_t req, void *data)
|
|||||||
pthread_kill(thread, SIGUSR2);
|
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)
|
static int _check_dev(void)
|
||||||
{
|
{
|
||||||
int rc;
|
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->tty_lock);
|
||||||
pthread_mutex_destroy(&tty->poll_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_NET].fd);
|
||||||
_fd_close(tty->fds[FD_MASTER].fd);
|
_fd_close(tty->fds[FD_MASTER].fd);
|
||||||
_fd_close(tty->fds[FD_SLAVE].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("-n %s", dev_name, 0),
|
||||||
TTYNET_OPT("--name=%s", dev_name, 0),
|
TTYNET_OPT("--name=%s", dev_name, 0),
|
||||||
TTYNET_OPT("-q", quiet, 1),
|
TTYNET_OPT("-q", quiet, 1),
|
||||||
|
TTYNET_OPT("-s %s", close_delay, 0),
|
||||||
TTYNET_OPT("-S %s", server, 0),
|
TTYNET_OPT("-S %s", server, 0),
|
||||||
TTYNET_OPT("--server=%s", server, 0),
|
TTYNET_OPT("--server=%s", server, 0),
|
||||||
FUSE_OPT_KEY("-h", 0),
|
FUSE_OPT_KEY("-h", 0),
|
||||||
@@ -1186,6 +1206,7 @@ static void print_help(void)
|
|||||||
"\t-n name, --name=name (default: ttyNVT0)\n"
|
"\t-n name, --name=name (default: ttyNVT0)\n"
|
||||||
"\t\tDevice will be created in /dev/$name.\n"
|
"\t\tDevice will be created in /dev/$name.\n"
|
||||||
"\t-q\t\tBe quiet (suppress informational messages)\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");
|
"\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);
|
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 = {
|
struct cuse_info ci = {
|
||||||
.dev_major = ttynvt_param.major,
|
.dev_major = ttynvt_param.major,
|
||||||
.dev_minor = ttynvt_param.minor,
|
.dev_minor = ttynvt_param.minor,
|
||||||
|
|||||||
Reference in New Issue
Block a user