spp.c revision bc085054220d80e9308fe5f4c2260e7ccc06e7e3
1bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann/* 2bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 3bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * BlueZ - Bluetooth protocol stack for Linux 4bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 5bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * Copyright (C) 2003-2004 Marcel Holtmann <marcel@holtmann.org> 6bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 7bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 8bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * This program is free software; you can redistribute it and/or modify 9bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * it under the terms of the GNU General Public License version 2 as 10bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * published by the Free Software Foundation; 11bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 12bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 13bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 15bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY 16bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 17bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 21bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 22bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 23bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * SOFTWARE IS DISCLAIMED. 24bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 25bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 26bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * $Id$ 27bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann */ 28bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 29bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#ifdef HAVE_CONFIG_H 30bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <config.h> 31bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#endif 32bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 33bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <stdio.h> 34bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <errno.h> 35bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <unistd.h> 36bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <signal.h> 37bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <sys/socket.h> 38bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 39bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <bluetooth/bluetooth.h> 40bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <bluetooth/rfcomm.h> 41bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 42bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmannint spp_print(bdaddr_t *src, bdaddr_t *dst, uint8_t channel, int fd, int copies) 43bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann{ 44bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann struct sockaddr_rc addr; 45bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann unsigned char buf[2048]; 46bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann int i, sk, len; 47bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 48bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if ((sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) < 0) { 49bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann perror("ERROR: Can't create socket"); 50bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return 1; 51bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 52bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 53bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann addr.rc_family = AF_BLUETOOTH; 54bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann bacpy(&addr.rc_bdaddr, src); 55bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann addr.rc_channel = 0; 56bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 57bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 58bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann perror("ERROR: Can't bind socket"); 59bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann close(sk); 60bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return 1; 61bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 62bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 63bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann addr.rc_family = AF_BLUETOOTH; 64bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann bacpy(&addr.rc_bdaddr, dst); 65bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann addr.rc_channel = channel; 66bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 67bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 68bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann perror("ERROR: Can't connect to device"); 69bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann close(sk); 70bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return 1; 71bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 72bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 73bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann /* Ignore SIGTERM signals if printing from stdin */ 74bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (fd == 0) { 75bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#ifdef HAVE_SIGSET 76bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sigset(SIGTERM, SIG_IGN); 77bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#elif defined(HAVE_SIGACTION) 78bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann memset(&action, 0, sizeof(action)); 79bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sigemptyset(&action.sa_mask); 80bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann action.sa_handler = SIG_IGN; 81bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sigaction(SIGTERM, &action, NULL); 82bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#else 83bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann signal(SIGTERM, SIG_IGN); 84bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#endif /* HAVE_SIGSET */ 85bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 86bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 87bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann for (i = 0; i < copies; i++) { 88bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 89bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (fd != 0) { 90bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann fprintf(stderr, "PAGE: 1 1\n"); 91bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann lseek(fd, 0, SEEK_SET); 92bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 93bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 94bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann while ((len = read(fd, buf, sizeof(buf))) > 0) { 95bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann write(sk, buf, len); 96bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 97bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 98bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 99bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 100bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann close(sk); 101bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 102bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return 0; 103bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann} 104