diff options
Diffstat (limited to 'rfcomm/main.c')
| -rw-r--r-- | rfcomm/main.c | 77 | 
1 files changed, 41 insertions, 36 deletions
diff --git a/rfcomm/main.c b/rfcomm/main.c index c03f6127..b0df9c72 100644 --- a/rfcomm/main.c +++ b/rfcomm/main.c @@ -44,6 +44,7 @@  #include "kword.h"  static char *rfcomm_config_file = NULL; +static int rfcomm_raw_tty = 0;  extern int optind, opterr, optopt;  extern char *optarg; @@ -325,10 +326,12 @@ static void cmd_connect(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **arg  		}  	} -	tcflush(fd, TCIOFLUSH); +	if (rfcomm_raw_tty) { +		tcflush(fd, TCIOFLUSH); -	cfmakeraw(&ti); -	tcsetattr(fd, TCSANOW, &ti); +		cfmakeraw(&ti); +		tcsetattr(fd, TCSANOW, &ti); +	}  	close(sk); @@ -368,32 +371,14 @@ static void cmd_listen(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **argv  	struct sockaddr_rc laddr, raddr;  	struct rfcomm_dev_req req;  	struct termios ti; +	struct sigaction sa; +	struct pollfd p;  	char dst[18], devname[MAXPATHLEN];  	int sk, nsk, fd, alen; -	int i; - -	if (argc < 3) { -		fprintf(stderr, "No command specified\n"); -		return; -	}  	laddr.rc_family = AF_BLUETOOTH;  	bacpy(&laddr.rc_bdaddr, bdaddr); - -	if (strncmp(argv[1], "exec", 4) == 0) { -		laddr.rc_channel = 1; -		argc -= 2; -		argv += 2; -	} else if (strncmp(argv[2], "exec", 4) == 0) { -		laddr.rc_channel = atoi(argv[1]); -		argc -= 3; -		argv += 3; -	} else { -		fprintf(stderr, "Unknown syntax\n"); -		return; -	} - -	argv[argc] = NULL; +	laddr.rc_channel = (argc < 2) ? 1 : atoi(argv[1]);  	if ((sk = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) < 0) {  		perror("Can't create RFCOMM socket"); @@ -444,27 +429,43 @@ static void cmd_listen(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **argv  		}  	} -	tcflush(fd, TCIOFLUSH); +	if (rfcomm_raw_tty) { +		tcflush(fd, TCIOFLUSH); -	cfmakeraw(&ti); -	tcsetattr(fd, TCSANOW, &ti); +		cfmakeraw(&ti); +		tcsetattr(fd, TCSANOW, &ti); +	}  	close(sk);  	close(nsk);  	ba2str(&req.dst, dst);  	printf("Connection from %s to %s\n", dst, devname); +	printf("Press CTRL-C for hangup\n"); + +	memset(&sa, 0, sizeof(sa)); +	sa.sa_flags   = SA_NOCLDSTOP; +	sa.sa_handler = SIG_IGN; +	sigaction(SIGCHLD, &sa, NULL); +	sigaction(SIGPIPE, &sa, NULL); + +	sa.sa_handler = sig_term; +	sigaction(SIGTERM, &sa, NULL); +	sigaction(SIGINT,  &sa, NULL); + +	sa.sa_handler = sig_hup; +	sigaction(SIGHUP, &sa, NULL); -	for (i = 1; i < argc; i++) -		if (strcmp(argv[i], "%d") == 0) -			argv[i] = devname; +	p.fd = fd; +	p.events = POLLERR | POLLHUP; -	printf("Executing "); -	for (i = 0; i < argc; i++) -		printf("%s%s", (i == 0) ? "\"" : " ", argv[i]); -	printf("\"\n"); +	while (!__io_canceled) { +		p.revents = 0; +		if (poll(&p, 1, 100)) +			break; +	} -	execvp(argv[0], argv); +	printf("Disconnected\n");  	close(fd);  } @@ -545,6 +546,7 @@ static struct option main_options[] = {  	{ "help",	0, 0, 'h' },  	{ "device",	1, 0, 'i' },  	{ "config",	1, 0, 'f' }, +	{ "raw",	0, 0, 'r' },  	{ 0, 0, 0, 0 }  }; @@ -556,7 +558,7 @@ int main(int argc, char *argv[])  	bacpy(&bdaddr, BDADDR_ANY); -	while ((opt = getopt_long(argc, argv, "+i:f:ah", main_options, NULL)) != -1) { +	while ((opt = getopt_long(argc, argv, "+i:f:rah", main_options, NULL)) != -1) {  		switch(opt) {  		case 'i':  			if (strncmp(optarg, "hci", 3) == 0) @@ -568,6 +570,9 @@ int main(int argc, char *argv[])  		case 'f':  			rfcomm_config_file = strdup(optarg);  			break; +		case 'r': +			rfcomm_raw_tty = 1; +			break;  		case 'a':  			show_all = 1;  | 
