This is just the first part -- it adds support for correctly reporting incoming connections when there's an external d?mon accepting the connections and invoking 'sshd -i' with them, like inetd does. In later patches I'll extend sshd to listen on a Bluetooth socket (and advertise the service in SDP) for itself, and extend the ssh client to make the connection directly. For now, I'm testing with http://david.woodhou.se/btserv.c and ssh -o 'ProxyCommand socat stdio SOCKET-CONNECT:31:3:x1ec1e4e21f000100' root at bluetooth Index: canohost.c ==================================================================RCS file: /cvs/openssh/canohost.c,v retrieving revision 1.75 diff -u -p -r1.75 canohost.c --- canohost.c 21 Jun 2009 08:13:58 -0000 1.75 +++ canohost.c 23 Nov 2009 09:50:32 -0000 @@ -20,6 +20,11 @@ #include <netinet/in.h> #include <arpa/inet.h> +#ifdef HAVE_BLUETOOTH +#include <bluetooth/bluetooth.h> +#include <bluetooth/rfcomm.h> +#endif + #include <ctype.h> #include <errno.h> #include <netdb.h> @@ -60,6 +65,16 @@ get_remote_hostname(int sock, int use_dn cleanup_exit(255); } +#ifdef HAVE_BLUETOOTH + if (from.ss_family == AF_BLUETOOTH) { + struct sockaddr_rc *from_rc = (void *)&from; + char ba[28]; + + sprintf(ba, "Bluetooth:"); + ba2str(&from_rc->rc_bdaddr, ba + 10); + return xstrdup(ba); + } +#endif if (from.ss_family == AF_INET) check_ip_options(sock, ntop); @@ -264,6 +279,16 @@ get_socket_address(int sock, int remote, return NULL; } +#ifdef HAVE_BLUETOOTH + if (addr.ss_family == AF_BLUETOOTH) { + struct sockaddr_rc *from_rc = (void *)&addr; + char ba[28]; + + sprintf(ba, "Bluetooth:"); + ba2str(&from_rc->rc_bdaddr, ba + 10); + return xstrdup(ba); + } +#endif /* Work around Linux IPv6 weirdness */ if (addr.ss_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); @@ -375,6 +400,13 @@ get_sock_port(int sock, int local) } } +#ifdef HAVE_BLUETOOTH + if (from.ss_family == AF_BLUETOOTH) { + struct sockaddr_rc *from_rc = (void *)&from; + + return from_rc->rc_channel; + } +#endif /* Work around Linux IPv6 weirdness */ if (from.ss_family == AF_INET6) fromlen = sizeof(struct sockaddr_in6); Index: configure.ac ==================================================================RCS file: /cvs/openssh/configure.ac,v retrieving revision 1.430 diff -u -p -r1.430 configure.ac --- configure.ac 11 Oct 2009 10:50:20 -0000 1.430 +++ configure.ac 23 Nov 2009 09:50:35 -0000 @@ -3636,6 +3636,27 @@ else fi AC_SUBST(mansubdir) +# Check whether to support Bluetooth +BLUETOOTH_MSG="no" +AC_ARG_ENABLE(bluetooth, + [ --disable-bluetooth disable Bluetooth support if detected [no]], + [ + if test "x$enableval" = "xno" ; then + disable_bluetooth=yes + fi + ] +) +if test -z "$disable_bluetooth" ; then + AC_CHECK_HEADERS(bluetooth/bluetooth.h, + [ AC_CHECK_LIB(bluetooth, ba2str, + [ LIBS="$LIBS -lbluetooth" + AC_DEFINE(HAVE_BLUETOOTH) + BLUETOOTH_MSG="yes" + ]) + ] + ) +fi + # Check whether to enable MD5 passwords MD5_MSG="no" AC_ARG_WITH(md5-passwords, @@ -4231,6 +4252,7 @@ echo " S/KEY support echo " TCP Wrappers support: $TCPW_MSG" echo " MD5 password support: $MD5_MSG" echo " libedit support: $LIBEDIT_MSG" +echo " Bluetooth support: $BLUETOOTH_MSG" echo " Solaris process contract support: $SPC_MSG" echo " IP address in \$DISPLAY hack: $DISPLAY_HACK_MSG" echo " Translate v4 in v6 hack: $IPV4_IN6_HACK_MSG" Index: packet.c ==================================================================RCS file: /cvs/openssh/packet.c,v retrieving revision 1.169 diff -u -p -r1.169 packet.c --- packet.c 2 Oct 2009 01:49:04 -0000 1.169 +++ packet.c 23 Nov 2009 09:50:36 -0000 @@ -308,6 +308,10 @@ packet_connection_is_on_socket(void) return 0; if (fromlen != tolen || memcmp(&from, &to, fromlen) != 0) return 0; +#ifdef HAVE_BLUETOOTH + if (from.ss_family == AF_BLUETOOTH) + return 1; +#endif if (from.ss_family != AF_INET && from.ss_family != AF_INET6) return 0; return 1; -- dwmw2