? Makefile ? Makefile.in ? aclocal.m4 ? autom4te.cache ? config.guess ? config.h ? config.h.in ? config.log ? config.status ? config.sub ? configure ? depcomp ? install-sh ? libtool ? ltmain.sh ? missing ? mkinstalldirs ? stamp-h.in ? stamp-h1 ? alsa/.deps ? alsa/Makefile ? alsa/Makefile.in ? common/.deps ? common/Makefile ? common/Makefile.in ? cups/.deps ? cups/Makefile ? cups/Makefile.in ? daemon/.deps ? daemon/Makefile ? daemon/Makefile.in ? dund/.deps ? dund/Makefile ? dund/Makefile.in ? extra/.deps ? extra/Makefile ? extra/Makefile.in ? fuse/.deps ? fuse/Makefile ? fuse/Makefile.in ? hcid/.deps ? hcid/Makefile ? hcid/Makefile.in ? hidd/.deps ? hidd/Makefile ? hidd/Makefile.in ? pand/.deps ? pand/Makefile ? pand/Makefile.in ? rfcomm/.deps ? rfcomm/.libs ? rfcomm/Makefile ? rfcomm/Makefile.in ? rfcomm/lexer.c ? rfcomm/main.c.modified ? rfcomm/main.patch ? rfcomm/parser.c ? rfcomm/parser.h ? rfcomm/rfcomm ? scripts/Makefile ? scripts/Makefile.in ? sdpd/.deps ? sdpd/Makefile ? sdpd/Makefile.in ? test/.deps ? test/Makefile ? test/Makefile.in ? tools/.deps ? tools/Makefile ? tools/Makefile.in Index: rfcomm/main.c =================================================================== RCS file: /cvsroot/bluez/utils/rfcomm/main.c,v retrieving revision 1.19 diff -u -r1.19 main.c --- rfcomm/main.c 6 Jul 2006 09:31:03 -0000 1.19 +++ rfcomm/main.c 9 Aug 2006 10:06:15 -0000 @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -252,6 +253,67 @@ return 0; } +static void run_command_line(struct pollfd* p, char* command_line, char* device_name) +{ + int i=0; + pid_t pid, child; + char command[256] = ""; +#define NBARGVS 8 + char * argv_table[NBARGVS+1]; + char* cur_arg=NULL; + char* next_arg=NULL; + int status = 0; + + memset(argv_table, 0, sizeof(argv_table)); + strncpy(command, command_line, sizeof(command)); + command[sizeof(command)-1]=0; + cur_arg = command; + + // Create params table, end with NULL hence +1 in declaration + i=0; + while(irevents = 0; + if (poll(p, 1, 200) || __io_canceled) { + kill(pid, SIGTERM); + waitpid(pid, &status, 0); + break; + } + } + break; + } +} + static void cmd_connect(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **argv) { struct sockaddr_rc laddr, raddr; @@ -402,6 +464,7 @@ socklen_t alen; char dst[18], devname[MAXPATHLEN]; int sk, nsk, fd, try = 30; + char* command_line = (argc < 3) ? NULL : argv[2]; laddr.rc_family = AF_BLUETOOTH; bacpy(&laddr.rc_bdaddr, bdaddr); @@ -499,10 +562,14 @@ p.fd = fd; p.events = POLLERR | POLLHUP; - while (!__io_canceled) { - p.revents = 0; - if (poll(&p, 1, 100)) - break; + if(!command_line) { + while (!__io_canceled) { + p.revents = 0; + if (poll(&p, 1, 100)) + break; + } + } else { + run_command_line(&p, command_line, devname); } printf("Disconnected\n"); @@ -510,6 +577,22 @@ close(fd); } +static void cmd_watch(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **argv) +{ + struct sigaction sa; + + sa.sa_handler = sig_term; + sigaction(SIGTERM, &sa, NULL); + sigaction(SIGINT, &sa, NULL); + + // While process not killed + while(!__io_canceled) + { + cmd_listen(ctl, dev, bdaddr, argc, argv); + usleep(100*1000); + } +} + static void cmd_create(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **argv) { if (strcmp(argv[0], "all") == 0) @@ -552,7 +635,8 @@ { "release", "unbind", cmd_release, "", "Release device" }, { "show", "info", cmd_show, "", "Show device" }, { "connect", "conn", cmd_connect, " [channel]", "Connect device" }, - { "listen", "server", cmd_listen, " [channel]", "Listen" }, + { "listen", "server", cmd_listen, " [channel [cmd]]", "Listen" }, + { "watch", "watch", cmd_watch, " [channel [cmd]]", "Watch" }, { NULL, NULL, NULL, 0, 0 } };