Skip to content

Commit

Permalink
implement accept(), bind() for l2cap sockets
Browse files Browse the repository at this point in the history
git-svn-id: http://ruby-bluetooth.rubyforge.org/svn/trunk@16 587dd09e-be1c-0410-a341-8ca66d93110d
  • Loading branch information
esteve committed Oct 5, 2006
1 parent 34f1cae commit 9b00712
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 deletions.
24 changes: 22 additions & 2 deletions src/bluetooth_linux/bluetooth_linux.c
Expand Up @@ -33,17 +33,18 @@ void Init_ruby_bluetooth()
rb_define_method(bt_socket_class, "inspect", bt_socket_inspect, 0);
rb_define_method(bt_socket_class, "for_fd", bt_socket_s_for_fd, 1);
rb_define_method(bt_socket_class, "listen", bt_socket_listen, 1);
rb_define_method(bt_socket_class, "accept", bt_socket_accept, 0);
rb_undef_method(bt_socket_class, "initialize");

bt_rfcomm_socket_class = rb_define_class_under(bt_module, "RFCOMMSocket", bt_socket_class);
rb_define_method(bt_rfcomm_socket_class, "initialize", bt_rfcomm_socket_init, -1);
rb_define_method(bt_rfcomm_socket_class, "connect", bt_rfcomm_socket_connect, 2);
rb_define_method(bt_rfcomm_socket_class, "accept", bt_rfcomm_socket_accept, 0);
rb_define_method(bt_rfcomm_socket_class, "bind", bt_rfcomm_socket_bind, 1);

bt_l2cap_socket_class = rb_define_class_under(bt_module, "L2CAPSocket", bt_socket_class);
rb_define_method(bt_l2cap_socket_class, "initialize", bt_l2cap_socket_init, -1);
rb_define_method(bt_l2cap_socket_class, "connect", bt_l2cap_socket_connect, 2);
rb_define_method(bt_l2cap_socket_class, "bind", bt_l2cap_socket_bind, 1);

bt_services_class = rb_define_class_under(bt_module, "Services", rb_cObject);
//rb_define_singleton_method(bt_services_class, "scan", bt_services_scan, 3);
Expand All @@ -62,7 +63,7 @@ void Init_ruby_bluetooth()

}

static VALUE bt_rfcomm_socket_accept(VALUE self) {
static VALUE bt_socket_accept(VALUE self) {
OpenFile *fptr;
VALUE sock2;
char buf[1024];
Expand Down Expand Up @@ -297,6 +298,25 @@ bt_rfcomm_socket_bind(VALUE self, VALUE port)
return INT2FIX(0);
}

static VALUE
bt_l2cap_socket_bind(VALUE self, VALUE port)
{
OpenFile *fptr;
int fd;

GetOpenFile(self, fptr);
fd = fileno(fptr->f);

struct sockaddr_l2 loc_addr = { 0 };
loc_addr.l2_family = AF_BLUETOOTH;
loc_addr.l2_bdaddr = *BDADDR_ANY;
loc_addr.l2_psm = (uint8_t) FIX2UINT(port);

if (bind(fd, (struct sockaddr *)&loc_addr, sizeof(loc_addr)) >= 0)
rb_iv_set(self, "@port", port);
return INT2FIX(0);
}

static VALUE bt_socket_inspect(VALUE self)
{
return self;
Expand Down
6 changes: 4 additions & 2 deletions src/bluetooth_linux/bluetooth_linux.h
Expand Up @@ -41,18 +41,20 @@ static VALUE bt_socket_s_for_fd(VALUE klass, VALUE fd);

static VALUE bt_socket_listen(VALUE klass, VALUE backlog);

static VALUE bt_socket_accept(VALUE sock);

static VALUE bt_rfcomm_socket_init(int argc, VALUE *argv, VALUE sock);

static VALUE bt_rfcomm_socket_connect(VALUE sock, VALUE host, VALUE port);

static VALUE bt_rfcomm_socket_bind(VALUE sock, VALUE port);

static VALUE bt_rfcomm_socket_accept(VALUE sock);

static VALUE bt_l2cap_socket_init(int argc, VALUE *argv, VALUE sock);

static VALUE bt_l2cap_socket_connect(VALUE sock, VALUE host, VALUE port);

static VALUE bt_l2cap_socket_bind(VALUE sock, VALUE port);

static VALUE bt_service_new(VALUE self, VALUE uuid, VALUE name, VALUE description, VALUE provider);

static VALUE bt_service_register(VALUE self, VALUE sock);
Expand Down

0 comments on commit 9b00712

Please sign in to comment.