*** /usr/src/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sppd.c Mon Dec 12 12:58:13 2005 --- rfcomm_sppd.c Fri Aug 18 16:32:40 2006 *************** *** 72,87 **** struct sockaddr_rfcomm ra; bdaddr_t addr; int n, background, channel, service, ! s, amaster, aslave, fd; fd_set rfd; char *tty = NULL, *ep = NULL, buf[SPPD_BUFFER_SIZE]; memcpy(&addr, NG_HCI_BDADDR_ANY, sizeof(addr)); background = channel = 0; service = SDP_SERVICE_CLASS_SERIAL_PORT; /* Parse command line options */ ! while ((n = getopt(argc, argv, "a:bc:t:h")) != -1) { switch (n) { case 'a': /* BDADDR */ if (!bt_aton(optarg, &addr)) { --- 72,88 ---- struct sockaddr_rfcomm ra; bdaddr_t addr; int n, background, channel, service, ! s, amaster, aslave, fd, doserver; fd_set rfd; char *tty = NULL, *ep = NULL, buf[SPPD_BUFFER_SIZE]; memcpy(&addr, NG_HCI_BDADDR_ANY, sizeof(addr)); background = channel = 0; service = SDP_SERVICE_CLASS_SERIAL_PORT; + doserver = 0; /* Parse command line options */ ! while ((n = getopt(argc, argv, "a:bc:t:hS")) != -1) { switch (n) { case 'a': /* BDADDR */ if (!bt_aton(optarg, &addr)) { *************** *** 134,139 **** --- 135,144 ---- tty = optarg; break; + case 'S': + doserver = 1; + break; + case 'h': default: usage(); *************** *** 142,148 **** } /* Check if we have everything we need */ ! if (memcmp(&addr, NG_HCI_BDADDR_ANY, sizeof(addr)) == 0) usage(); /* NOT REACHED */ --- 147,153 ---- } /* Check if we have everything we need */ ! if (!doserver && memcmp(&addr, NG_HCI_BDADDR_ANY, sizeof(addr)) == 0) usage(); /* NOT REACHED */ *************** *** 165,178 **** if (sigaction(SIGCHLD, &sa, NULL) < 0) err(1, "Could not sigaction(SIGCHLD)"); - /* Check channel, if was not set then obtain it via SDP */ - if (channel == 0 && service != 0) - if (rfcomm_channel_lookup(NULL, &addr, - service, &channel, &n) != 0) - errc(1, n, "Could not obtain RFCOMM channel"); - if (channel <= 0 || channel> 30) - errx(1, "Invalid RFCOMM channel number %d", channel); - /* Open TTYs */ if (tty == NULL) { if (background) --- 170,175 ---- *************** *** 187,210 **** fd = amaster; } - /* Open RFCOMM connection */ - memset(&ra, 0, sizeof(ra)); - ra.rfcomm_len = sizeof(ra); - ra.rfcomm_family = AF_BLUETOOTH; - - s = socket(PF_BLUETOOTH, SOCK_STREAM, BLUETOOTH_PROTO_RFCOMM); - if (s < 0) - err(1, "Could not create socket"); ! if (bind(s, (struct sockaddr *) &ra, sizeof(ra)) < 0) ! err(1, "Could not bind socket"); ! memcpy(&ra.rfcomm_bdaddr, &addr, sizeof(ra.rfcomm_bdaddr)); ! ra.rfcomm_channel = channel; ! if (connect(s, (struct sockaddr *) &ra, sizeof(ra)) < 0) ! err(1, "Could not connect socket"); /* Became daemon if required */ if (background) { --- 184,278 ---- fd = amaster; } /* Open RFCOMM connection */ ! if (doserver) { ! struct sockaddr_rfcomm ma; ! bdaddr_t bt_addr_any; ! sdp_lan_profile_t lan; ! void *ss; /* should be some other type! */ ! uint32_t sdp_handle; ! int acceptsock, aaddrlen; ! ! if (channel == 0) ! channel = (getpid() % 30) + 1; /* hopefully not in use */ ! ! acceptsock = socket(PF_BLUETOOTH, SOCK_STREAM, BLUETOOTH_PROTO_RFCOMM); ! if (acceptsock < 0) ! err(1, "Could not create socket"); ! ! memset(&ma, 0, sizeof(ma)); ! ma.rfcomm_len = sizeof(ma); ! ma.rfcomm_family = AF_BLUETOOTH; ! ma.rfcomm_channel = channel; ! ! if (bind(acceptsock, (struct sockaddr *) &ma, sizeof(ma)) < 0) ! err(1, "Could not bind socket -- channel %d in use?", channel); ! listen(acceptsock, 10); ! ! ss = sdp_open_local(NULL); ! if (ss == NULL) ! errx(1, "Unable to create local SDP session"); ! if (sdp_error(ss) != 0) ! errx(1, "Unable to open local SDP session. " \ ! "%s (%d)", strerror(sdp_error(ss)), ! sdp_error(ss)); ! ! memset(&lan, 0, sizeof(lan)); ! lan.server_channel = channel; ! ! memcpy(&bt_addr_any, NG_HCI_BDADDR_ANY, sizeof(bt_addr_any)); ! if (sdp_register_service(ss, ! service, ! &bt_addr_any, (void *) &lan, sizeof(lan), &sdp_handle) != 0) { ! errx(1, "Unable to register LAN service with " \ ! "local SDP daemon. %s (%d)", ! strerror(sdp_error(ss)), sdp_error(ss)); ! } ! ! s = -1; ! while (s < 0) { ! aaddrlen = sizeof (ra); ! s = accept(acceptsock, (struct sockaddr *) &ra, &aaddrlen); ! if (s < 0) ! err(1, "Unable to accept()"); ! if (memcmp(&addr, NG_HCI_BDADDR_ANY, sizeof(addr))) { ! if (memcmp(&addr, &ra.rfcomm_bdaddr, sizeof(addr))) { ! warnx("Connect from wrong client"); ! close(s); ! s = -1; ! } ! } ! } ! sdp_unregister_service(ss, sdp_handle); ! sdp_close(ss); ! close(acceptsock); ! } else { ! /* Check channel, if was not set then obtain it via SDP */ ! if (channel == 0 && service != 0) ! if (rfcomm_channel_lookup(NULL, &addr, ! service, &channel, &n) != 0) ! errc(1, n, "Could not obtain RFCOMM channel"); ! if (channel <= 0 || channel> 30) ! errx(1, "Invalid RFCOMM channel number %d", channel); ! ! s = socket(PF_BLUETOOTH, SOCK_STREAM, BLUETOOTH_PROTO_RFCOMM); ! if (s < 0) ! err(1, "Could not create socket"); ! ! if (bind(s, (struct sockaddr *) &ra, sizeof(ra)) < 0) ! err(1, "Could not bind socket"); ! ! memset(&ra, 0, sizeof(ra)); ! ra.rfcomm_len = sizeof(ra); ! ra.rfcomm_family = AF_BLUETOOTH; ! memcpy(&ra.rfcomm_bdaddr, &addr, sizeof(ra.rfcomm_bdaddr)); ! ra.rfcomm_channel = channel; ! if (connect(s, (struct sockaddr *) &ra, sizeof(ra)) < 0) ! err(1, "Could not connect socket"); ! } /* Became daemon if required */ if (background) { *************** *** 346,352 **** ttygid = -1; (void) chown(tty, getuid(), ttygid); ! (void) chmod(tty, S_IRUSR|S_IWUSR|S_IWGRP); (void) revoke(tty); if ((*aslave = open(tty, O_RDWR, 0)) < 0) { --- 414,420 ---- ttygid = -1; (void) chown(tty, getuid(), ttygid); ! (void) chmod(tty, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP); (void) revoke(tty); if ((*aslave = open(tty, O_RDWR, 0)) < 0) { *************** *** 433,444 **** fprintf(stdout, "Usage: %s options\n" \ "Where options are:\n" \ ! "\t-a address Address to connect to (required)\n" \ "\t-b Run in background\n" \ "\t-c channel RFCOMM channel to connect to\n" \ "\t-t tty TTY name (required in background mode)\n" \ "\t-h Display this message\n", SPPD_IDENT); - exit(255); } /* usage */ --- 501,512 ---- fprintf(stdout, "Usage: %s options\n" \ "Where options are:\n" \ ! "\t-a address Peer address (required in client mode)\n" \ "\t-b Run in background\n" \ "\t-c channel RFCOMM channel to connect to\n" \ "\t-t tty TTY name (required in background mode)\n" \ + "\t-S Serve an RFCOMM connection to one client\n" \ "\t-h Display this message\n", SPPD_IDENT); exit(255); } /* usage */

AltStyle によって変換されたページ (->オリジナル) /