diff options
-rw-r--r-- | test/l2test.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/test/l2test.c b/test/l2test.c index c345d06a..fa8cdf5e 100644 --- a/test/l2test.c +++ b/test/l2test.c @@ -78,6 +78,7 @@ int master = 0; int auth = 0; int encrypt = 0; int socktype = SOCK_SEQPACKET; +int linger = 0; float tv2fl(struct timeval tv) { @@ -118,6 +119,16 @@ int do_connect(char *svr) return -1; } + /* Enable SO_LINGER */ + if (linger) { + struct linger l = { .l_onoff = 1, .l_linger = linger }; + if (setsockopt(s, SOL_SOCKET, SO_LINGER, &l, sizeof(l)) < 0) { + syslog(LOG_ERR, "Can't enable SO_LINGER. %s(%d)", + strerror(errno), errno); + return -1; + } + } + memset(&rem_addr, 0, sizeof(rem_addr)); rem_addr.l2_family = AF_BLUETOOTH; baswap(&rem_addr.l2_bdaddr, strtoba(svr)); @@ -228,6 +239,16 @@ void do_listen( void (*handler)(int sk) ) syslog(LOG_INFO, "Connect from %s [imtu %d, omtu %d, flush_to %d]\n", batostr(&ba), opts.imtu, opts.omtu, opts.flush_to); + /* Enable SO_LINGER */ + if (linger) { + struct linger l = { .l_onoff = 1, .l_linger = linger }; + if (setsockopt(s, SOL_SOCKET, SO_LINGER, &l, sizeof(l)) < 0) { + syslog(LOG_ERR, "Can't enable SO_LINGER. %s(%d)", + strerror(errno), errno); + exit(1); + } + } + handler(s1); syslog(LOG_INFO, "Disconnect\n"); @@ -390,6 +411,7 @@ void usage(void) "\t[-b bytes] [-S bdaddr] [-P psm]\n" "\t[-I imtu] [-O omtu]\n" "\t[-N num] send num blocks (default = infinite)\n" + "\t[-L seconds] enable SO_LINGER\n" "\t[-D] use connectionless channel (datagram)\n" "\t[-A] request authentication\n" "\t[-E] request encryption\n" @@ -406,7 +428,7 @@ int main(int argc ,char *argv[]) mode = RECV; need_addr = 0; - while ((opt=getopt(argc,argv,"rdscuwmnb:P:I:O:S:N:MAED")) != EOF) { + while ((opt=getopt(argc,argv,"rdscuwmnb:P:I:O:S:N:MAEDL:")) != EOF) { switch(opt) { case 'r': mode = RECV; @@ -465,6 +487,10 @@ int main(int argc ,char *argv[]) omtu = atoi(optarg); break; + case 'L': + linger = atoi(optarg); + break; + case 'M': master = 1; break; |