spp.c revision a71ed7ebdf0599e0a019c9087669a62e026109a2
1bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann/* 2bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 3bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * BlueZ - Bluetooth protocol stack for Linux 4bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 5e823c15e43a6f924779e466d434c51157002d9eeMarcel Holtmann * Copyright (C) 2003-2008 Marcel Holtmann <marcel@holtmann.org> 6bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 7bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 8bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * This program is free software; you can redistribute it and/or modify 9632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * it under the terms of the GNU General Public License as published by 10632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * the Free Software Foundation; either version 2 of the License, or 11632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * (at your option) any later version. 12bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 13632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * This program is distributed in the hope that it will be useful, 14632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 15632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * GNU General Public License for more details. 17bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 18632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * You should have received a copy of the GNU General Public License 19632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * along with this program; if not, write to the Free Software 20632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 21bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 22bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann */ 23bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 24bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#ifdef HAVE_CONFIG_H 25bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <config.h> 26bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#endif 27bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 28bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <stdio.h> 29bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <errno.h> 30bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <unistd.h> 31bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <signal.h> 32bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <sys/socket.h> 33bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 34bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <bluetooth/bluetooth.h> 35bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <bluetooth/rfcomm.h> 36bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 37a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann#include "cups.h" 38a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann 39a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmannint spp_print(bdaddr_t *src, bdaddr_t *dst, uint8_t channel, int fd, int copies, const char *cups_class) 40bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann{ 41bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann struct sockaddr_rc addr; 42bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann unsigned char buf[2048]; 43b102348e988e4abc5d579ce13c067ce2c885aaf7Marcel Holtmann int i, sk, err, len; 44bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 45bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if ((sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) < 0) { 46bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann perror("ERROR: Can't create socket"); 47a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann if (cups_class) 48a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann return CUPS_BACKEND_FAILED; 49a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann else 50a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann return CUPS_BACKEND_RETRY; 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); 60a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann if (cups_class) 61a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann return CUPS_BACKEND_FAILED; 62a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann else 63a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann return CUPS_BACKEND_RETRY; 64bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 65bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 66bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann addr.rc_family = AF_BLUETOOTH; 67bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann bacpy(&addr.rc_bdaddr, dst); 68bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann addr.rc_channel = channel; 69bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 70bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 71bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann perror("ERROR: Can't connect to device"); 72bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann close(sk); 73a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann if (cups_class) 74a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann return CUPS_BACKEND_FAILED; 75a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann else 76a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann return CUPS_BACKEND_RETRY; 77bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 78bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 7969f9e21b46e2827a24cad0436d52a47fdd4ee36aMarcel Holtmann fputs("STATE: -connecting-to-device\n", stderr); 8069f9e21b46e2827a24cad0436d52a47fdd4ee36aMarcel Holtmann 81bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann /* Ignore SIGTERM signals if printing from stdin */ 82bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (fd == 0) { 83bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#ifdef HAVE_SIGSET 84bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sigset(SIGTERM, SIG_IGN); 85bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#elif defined(HAVE_SIGACTION) 86bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann memset(&action, 0, sizeof(action)); 87bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sigemptyset(&action.sa_mask); 88bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann action.sa_handler = SIG_IGN; 89bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sigaction(SIGTERM, &action, NULL); 90bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#else 91bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann signal(SIGTERM, SIG_IGN); 92bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#endif /* HAVE_SIGSET */ 93bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 94bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 95bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann for (i = 0; i < copies; i++) { 96bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 97bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (fd != 0) { 98bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann fprintf(stderr, "PAGE: 1 1\n"); 99bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann lseek(fd, 0, SEEK_SET); 100bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 101bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 102bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann while ((len = read(fd, buf, sizeof(buf))) > 0) { 103b102348e988e4abc5d579ce13c067ce2c885aaf7Marcel Holtmann err = write(sk, buf, len); 10469f9e21b46e2827a24cad0436d52a47fdd4ee36aMarcel Holtmann if (err < 0) { 10569f9e21b46e2827a24cad0436d52a47fdd4ee36aMarcel Holtmann perror("ERROR: Error writing to device"); 10669f9e21b46e2827a24cad0436d52a47fdd4ee36aMarcel Holtmann close(sk); 107a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann return CUPS_BACKEND_FAILED; 10869f9e21b46e2827a24cad0436d52a47fdd4ee36aMarcel Holtmann } 109bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 110bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 111bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 112bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 113bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann close(sk); 114bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 115a71ed7ebdf0599e0a019c9087669a62e026109a2Marcel Holtmann return CUPS_BACKEND_OK; 116bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann} 117