/* * Function btobex_listen (self) * * Listen for incoming connections. * */ int btobex_listen(obex_t *self) { #ifndef _WIN32 DEBUG(3, "\n"); self->serverfd = obex_create_socket(self, AF_BLUETOOTH); if(self->serverfd < 0) { DEBUG(0, "Error creating socket\n"); return -1; } if (bind(self->serverfd, (struct sockaddr*) &self->trans.self.rfcomm, sizeof(struct sockaddr_rc))) { DEBUG(0, "Error doing bind\n"); goto out_freesock; } if (listen(self->serverfd, 1)) { DEBUG(0, "Error doing listen\n"); goto out_freesock; } DEBUG(4, "We are now listening for connections\n"); return 1; out_freesock: obex_delete_socket(self, self->serverfd); self->serverfd = -1; #endif /* _WIN32 */ return -1; }
/* * Function irobex_irda_connect_request (self) * * Open the TTP connection * */ int irobex_connect_request(obex_t *self) { int mtu = 0; int len = sizeof(int); int ret; DEBUG(4, "\n"); if(self->fd < 0) { self->fd = obex_create_socket(self, AF_IRDA); if(self->fd < 0) return -1; } /* Check if the application did supply a valid address. * You need to use OBEX_TransportConnect() for that. Jean II */ if(irobex_no_addr(&self->trans.peer.irda)) { /* Nope. Go find one... */ ret = irobex_discover_devices(self); if (ret < 0) { DEBUG(1, "No devices in range\n"); goto out_freesock; } } ret = connect(self->fd, (struct sockaddr*) &self->trans.peer.irda, sizeof(struct sockaddr_irda)); if (ret < 0) { DEBUG(4, "ret=%d\n", ret); goto out_freesock; } #ifndef _WIN32 /* Check what the IrLAP data size is */ ret = getsockopt(self->fd, SOL_IRLMP, IRTTP_MAX_SDU_SIZE, (void *) &mtu, &len); if (ret < 0) { goto out_freesock; } #else mtu = 512; #endif self->trans.mtu = mtu; DEBUG(2, "transport mtu=%d\n", mtu); return 1; out_freesock: obex_delete_socket(self, self->fd); self->fd = -1; return ret; }
/* * Function irobex_listen (self) * * Listen for incoming connections. * */ int irobex_listen(obex_t *self) { DEBUG(3, "\n"); self->serverfd = obex_create_socket(self, AF_IRDA); if(self->serverfd < 0) { DEBUG(0, "Error creating socket\n"); return -1; } if (bind(self->serverfd, (struct sockaddr*) &self->trans.self.irda, sizeof(struct sockaddr_irda))) { DEBUG(0, "Error doing bind\n"); goto out_freesock; } #ifndef _WIN32 /* Ask the IrDA stack to advertise the Obex hint bit - Jean II */ /* Under Linux, it's a regular socket option */ { unsigned char hints[4]; /* Hint be we advertise */ /* We want to advertise the OBEX hint bit */ hints[0] = HINT_EXTENSION; hints[1] = HINT_OBEX; /* Tell the stack about it */ if (setsockopt(self->serverfd, SOL_IRLMP, IRLMP_HINTS_SET, hints, sizeof(hints))) { /* This command is not supported by older kernels, so ignore any errors! */ } } #else /* _WIN32 */ /* Ask the IrDA stack to advertise the Obex hint bit */ /* Under Windows, it's a complicated story */ #endif /* _WIN32 */ if (listen(self->serverfd, 1)) { DEBUG(0, "Error doing listen\n"); goto out_freesock; } DEBUG(4, "We are now listening for connections\n"); return 1; out_freesock: obex_delete_socket(self, self->serverfd); self->serverfd = -1; return -1; }
/* * Function btobex_irda_connect_request (self) * * Open the RFCOMM connection * */ int btobex_connect_request(obex_t *self) { int ret; #ifndef _WIN32 int mtu = 0; //int len = sizeof(int); DEBUG(4, "\n"); if(self->fd < 0) { self->fd = obex_create_socket(self, AF_BLUETOOTH); if(self->fd < 0) return -1; } ret = bind(self->fd, (struct sockaddr*) &self->trans.self.rfcomm, sizeof(struct sockaddr_rc)); if (ret < 0) { DEBUG(4, "ret=%d\n", ret); goto out_freesock; } ret = connect(self->fd, (struct sockaddr*) &self->trans.peer.rfcomm, sizeof(struct sockaddr_rc)); if (ret < 0) { DEBUG(4, "ret=%d\n", ret); goto out_freesock; } mtu = OBEX_DEFAULT_MTU; self->trans.mtu = mtu; DEBUG(2, "transport mtu=%d\n", mtu); return 1; out_freesock: obex_delete_socket(self, self->fd); self->fd = -1; #endif /* _WIN32 */ return ret; }