From owner-freebsd-ports@FreeBSD.ORG Tue Jan 13 07:30:04 2009 Return-Path: Delivered-To: freebsd-ports@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0BE37106566B for ; Tue, 13 Jan 2009 07:30:04 +0000 (UTC) (envelope-from freebsd-ports@m.gmane.org) Received: from ciao.gmane.org (main.gmane.org [80.91.229.2]) by mx1.freebsd.org (Postfix) with ESMTP id 245F28FC14 for ; Tue, 13 Jan 2009 07:30:02 +0000 (UTC) (envelope-from freebsd-ports@m.gmane.org) Received: from list by ciao.gmane.org with local (Exim 4.43) id 1LMdir-0006cY-SO for freebsd-ports@freebsd.org; Tue, 13 Jan 2009 07:30:01 +0000 Received: from 81.210.237.210 ([81.210.237.210]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 13 Jan 2009 07:30:01 +0000 Received: from saper by 81.210.237.210 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 13 Jan 2009 07:30:01 +0000 X-Injected-Via-Gmane: http://gmane.org/ To: freebsd-ports@freebsd.org From: Marcin Cieslak Date: Tue, 13 Jan 2009 08:29:51 +0100 Lines: 627 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------070807010003080108040708" X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 81.210.237.210 User-Agent: Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.8.1.18) Gecko/20081228 SeaMonkey/1.1.13 Sender: news Subject: comms/gammu: preliminary patch to talk SDP X-BeenThere: freebsd-ports@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting software to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 13 Jan 2009 07:30:04 -0000 This is a multi-part message in MIME format. --------------070807010003080108040708 Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit Hello, Attached please find a preliminary support to make gammu discover the Bluetooth RFCOMM channel number using sdp(3). The patch currently has a hard-coded search for the "OBEX File Transfer" class, as I have some trouble understanding reasons for logic behind "bluetooth_checkservicename()" function (in common/device/devfunc.c). This code correctly parses SDP response and extracts the RFCOMM channel for the desired protocol. I have basically copied the code from sdpcontrol(8) to do this. I am unable to test this further as I cannot figure out the correct way to talk to my phone (My Nokia refuses to talk on the OBEX File Transfer RFCOMM channel #10 despite being advertised via SDP), but this code delivers the expected channel number to the Bluetooth connect(2) call. Probably it can be made usable for most of the people in a short time therefore I thought somebody will be able to pick it from there. Btw, the maintainer's email address (bsm@...) bounces. --Marcin --------------070807010003080108040708 Content-Type: text/x-diff; name="gammu-sdp.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="gammu-sdp.diff" ===> Generating patch ===> Viewing diff with more diff -ruN --exclude=CVS /usr/ports/comms/gammu/files/patch-CMakeLists.txt /usr/home/saper/FreeBSD/ports/gammu/files/patch-CMakeLists.txt --- /usr/ports/comms/gammu/files/patch-CMakeLists.txt 2007-12-16 21:59:51.000000000 +0100 +++ /usr/home/saper/FreeBSD/ports/gammu/files/patch-CMakeLists.txt 2009-01-13 05:00:37.883255000 +0100 @@ -1,6 +1,32 @@ ---- CMakeLists.txt.orig 2007-08-08 16:30:55.000000000 +0400 -+++ CMakeLists.txt 2007-08-21 00:18:05.000000000 +0400 -@@ -601,7 +604,7 @@ +--- CMakeLists.txt.orig 2008-12-19 10:31:54.000000000 +0100 ++++ CMakeLists.txt 2009-01-13 05:00:34.875317481 +0100 +@@ -204,7 +204,11 @@ + find_package (FBSDBluetooth) + if (FBSD_BLUE_FOUND) + set(BLUETOOTH_FOUND ON) +- set(BLUETOOTH_SEARCH FALSE) ++ if (FBSD_SDP_FOUND) ++ set(BLUETOOTH_SEARCH TRUE) ++ else (FBSD_SDP_FOUND) ++ set(BLUETOOTH_SEARCH FALSE) ++ endif (FBSD_SDP_FOUND) + endif (FBSD_BLUE_FOUND) + find_package (OSXBluetooth) + if (OSX_BLUE_FOUND) +@@ -282,6 +286,12 @@ + endif (NOT "${FBSD_BLUE_LIBRARIES}" STREQUAL "") + endif (FBSD_BLUE_FOUND) + ++if (FBSD_SDP_FOUND) ++ if (NOT "${FBSD_SDP_LIBRARIES}" STREQUAL "") ++ set (GAMMU_LIBS "${GAMMU_LIBS} -l${FBSD_SDP_LIBRARIES}") ++ endif (NOT "${FBSD_SDP_LIBRARIES}" STREQUAL "") ++endif (FBSD_SDP_FOUND) ++ + if (ICONV_FOUND) + if (NOT "${ICONV_LIBRARIES}" STREQUAL "") + set (GAMMU_LIBS "${GAMMU_LIBS} -l${ICONV_LIBRARIES}") +@@ -721,7 +731,7 @@ set (INSTALL_DOC_DIR "share/doc/gammu" CACHE STRING "Path for documentation installation") mark_as_advanced (INSTALL_DOC_DIR) diff -ruN --exclude=CVS /usr/ports/comms/gammu/files/patch-FindFBSDBluetooth.cmake /usr/home/saper/FreeBSD/ports/gammu/files/patch-FindFBSDBluetooth.cmake --- /usr/ports/comms/gammu/files/patch-FindFBSDBluetooth.cmake 1970-01-01 01:00:00.000000000 +0100 +++ /usr/home/saper/FreeBSD/ports/gammu/files/patch-FindFBSDBluetooth.cmake 2009-01-13 05:04:56.330885000 +0100 @@ -0,0 +1,47 @@ +--- cmake/FindFBSDBluetooth.cmake.orig 2007-09-03 04:06:48.000000000 +0200 ++++ cmake/FindFBSDBluetooth.cmake 2009-01-13 05:04:44.992120772 +0100 +@@ -10,7 +10,7 @@ + + if (NOT DEFINED FBSD_BLUE_FOUND) + if (NOT CROSS_MINGW) +- find_path(FBSD_BLUE_INCLUDE_DIR NAMES bluetooth.h ++ find_path(FBSD_BLUE_INCLUDE_DIR NAMES bluetooth.h sdp.h + PATHS + /usr/include + /usr/local/include +@@ -22,14 +22,33 @@ + /usr/local/lib + ) + ++ find_path(FBSD_SDP_INCLUDE_DIR NAMES sdp.h ++ PATHS ++ /usr/include ++ /usr/local/include ++ ) ++ ++ find_library(FBSD_SDP_LIBRARIES NAMES sdp ++ PATHS ++ /usr/lib ++ /usr/local/lib ++ ) ++ + if(FBSD_BLUE_INCLUDE_DIR AND FBSD_BLUE_LIBRARIES) + set(FBSD_BLUE_FOUND TRUE CACHE INTERNAL "FreeBSD Bluetooth found") + message(STATUS "Found FreeBSD Bluetooth: ${FBSD_BLUE_INCLUDE_DIR}, ${FBSD_BLUE_LIBRARIES}") ++ if(FBSD_SDP_INCLUDE_DIR AND FBSD_SDP_LIBRARIES) ++ set(FBSD_SDP_FOUND TRUE CACHE INTERNAL "FreeBSD SDP found") ++ message(STATUS "Found FreeBSD SDP: ${FBSD_SDP_INCLUDE_DIR}, ${FBSD_SDP_LIBRARIES}") ++ else(FBSD_SDP_INCLUDE_DIR AND FBSD_SDP_LIBRARIES) ++ set(FBSD_SDP_FOUND FALSE CACHE INTERNAL "FreeBSD SDP not found") ++ message(STATUS "FreeBSD SDP not found.") ++ endif(FBSD_SDP_INCLUDE_DIR AND FBSD_SDP_LIBRARIES) + else(FBSD_BLUE_INCLUDE_DIR AND FBSD_BLUE_LIBRARIES) +- set(FBSD_BLUE_FOUND FALSE CACHE INTERNAL "FreeBSD Bluetooth found") ++ set(FBSD_BLUE_FOUND FALSE CACHE INTERNAL "FreeBSD Bluetooth not found") + message(STATUS "FreeBSD Bluetooth not found.") + endif(FBSD_BLUE_INCLUDE_DIR AND FBSD_BLUE_LIBRARIES) + +- mark_as_advanced(FBSD_BLUE_INCLUDE_DIR FBSD_BLUE_LIBRARIES) ++ mark_as_advanced(FBSD_BLUE_INCLUDE_DIR FBSD_BLUE_LIBRARIES FBSD_SDP_INCLUDE_DIR FBSD_SDP_LIBRARIES) + endif (NOT CROSS_MINGW) + endif (NOT DEFINED FBSD_BLUE_FOUND) diff -ruN --exclude=CVS /usr/ports/comms/gammu/files/patch-bluetooth /usr/home/saper/FreeBSD/ports/gammu/files/patch-bluetooth --- /usr/ports/comms/gammu/files/patch-bluetooth 2007-08-11 19:10:28.000000000 +0200 +++ /usr/home/saper/FreeBSD/ports/gammu/files/patch-bluetooth 2009-01-13 07:40:15.920566688 +0100 @@ -1,66 +1,425 @@ ---- common/device/bluetoth/bluez.c.orig 2007-03-10 19:47:59.000000000 +0300 -+++ common/device/bluetoth/bluez.c 2007-06-29 20:00:48.000000000 +0400 -@@ -23,6 +23,8 @@ - #ifdef GSM_ENABLE_BLUETOOTHDEVICE - #ifdef GSM_ENABLE_BLUEZ - -+#define BDADDR_ANY NG_HCI_BDADDR_ANY -+ - #include - #include - #include -@@ -31,11 +33,7 @@ - #include +--- common/device/bluetoth/blue_fbsd.c.orig 2008-08-05 11:49:08.000000000 +0200 ++++ common/device/bluetoth/blue_fbsd.c 2009-01-13 07:39:51.240082825 +0100 +@@ -1,4 +1,5 @@ + /* Based on some work from Bluez (www.bluez.org) ++ + * (C) 2000-2001 Qualcomm Incorporated + * (C) 2002-2003 Maxim Krasnyansky + * (C) 2002-2004 Marcel Holtmann +@@ -33,16 +34,19 @@ #include #include --#include --#include --#include --#include --#include -+#include + #include ++#ifdef BLUETOOTH_RF_SEARCHING ++#include ++#include ++#endif #include "../../gsmcomon.h" #include "../devfunc.h" -@@ -44,7 +42,7 @@ - GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device) + #include "bluetoth.h" + +-GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device) ++GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, const char *device) { GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth; -- struct sockaddr_rc laddr, raddr; -+ struct sockaddr_rfcomm laddr, raddr; - bdaddr_t bdaddr; + struct sockaddr_rfcomm laddr, raddr; +- bdaddr_t bdaddr; int fd; -@@ -53,15 +51,15 @@ + memset(&laddr, 0, sizeof(laddr)); +@@ -50,13 +54,20 @@ smprintf(s, "Connecting to RF channel %i\n",port); -- fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); -+ fd = socket(PF_BLUETOOTH, SOCK_STREAM, BLUETOOTH_PROTO_RFCOMM); ++ raddr.rfcomm_family = AF_BLUETOOTH; ++ raddr.rfcomm_channel = port; ++ if (bt_aton(device, &raddr.rfcomm_bdaddr) < 1) { ++ smprintf(s, "Invalid address specified: %s\n", device); ++ return ERR_DEVICEOPENERROR; ++ } ++ + fd = socket(PF_BLUETOOTH, SOCK_STREAM, BLUETOOTH_PROTO_RFCOMM); if (fd < 0) { dbgprintf("Can't create socket\n"); return ERR_DEVICENODRIVER; } -- bacpy(&laddr.rc_bdaddr, BDADDR_ANY); -- laddr.rc_family = AF_BLUETOOTH; -- laddr.rc_channel = 0; -+ bacpy(&laddr.rfcomm_bdaddr, BDADDR_ANY); -+ laddr.rfcomm_family = AF_BLUETOOTH; -+ laddr.rfcomm_channel = 0; - - if (bind(fd, (struct sockaddr *)&laddr, sizeof(laddr)) < 0) { - dbgprintf("Can't bind socket\n"); -@@ -70,9 +68,9 @@ - } +- bacpy(&laddr.rfcomm_bdaddr, NG_HCI_BDADDR_ANY); ++ memcpy(&laddr.rfcomm_bdaddr, NG_HCI_BDADDR_ANY, sizeof(bdaddr_t)); + laddr.rfcomm_family = AF_BLUETOOTH; + laddr.rfcomm_channel = 0; - str2ba(device, &bdaddr); -- bacpy(&raddr.rc_bdaddr, &bdaddr); -- raddr.rc_family = AF_BLUETOOTH; -- raddr.rc_channel = port; -+ bacpy(&raddr.rfcomm_bdaddr, &bdaddr); -+ raddr.rfcomm_family = AF_BLUETOOTH; -+ raddr.rfcomm_channel = port; +@@ -66,11 +77,6 @@ + return ERR_DEVICEOPENERROR; + } +- str2ba(device, &bdaddr); +- bacpy(&raddr.rfcomm_bdaddr, &bdaddr); +- raddr.rfcomm_family = AF_BLUETOOTH; +- raddr.rfcomm_channel = port; +- if (connect(fd, (struct sockaddr *)&raddr, sizeof(raddr)) < 0) { - dbgprintf("Can't connect\n"); + smprintf(s, "Can't connect (%d, %s)\n", errno, strerror(errno)); + close(fd); +@@ -82,133 +88,243 @@ + } + + #ifdef BLUETOOTH_RF_SEARCHING +-#warning This code is not ported to FreeBSD stack! +- +-static GSM_Error bluetooth_checkdevice(GSM_StateMachine *s, bdaddr_t *bdaddr, uuid_t *group) ++GSM_Error bluetooth_findchannel(GSM_StateMachine *s) + { +- sdp_session_t *sess; +- sdp_record_t *rec; +- sdp_list_t *attrid, *search, *seq, *next, *proto; +- sdp_data_t *d; +- bdaddr_t interface; +- uint32_t range = 0x0000ffff; +- char str[20]; +- int channel,dd; +- char name[1000]; +- int score, bestscore = 0; +- int found = -1; +- uuid_t subgroup; +- +- bacpy(&interface,NG_HCI_BDADDR_ANY); +- +- ba2str(bdaddr, str); +- smprintf(s,"Device %s", str); +- +- /* Try to read name */ +- dd = hci_open_dev(0); +- if (dd < 0) return ERR_UNKNOWN; +- memset(name, 0, sizeof(name)); +- if (hci_read_remote_name(dd, bdaddr, sizeof(name), name, 100000) >= 0) { +- smprintf(s, " (\"%s\")", name); +- } +- close(dd); +- smprintf(s,"\n"); +- +- /* Connect to device */ +- sess = sdp_connect(&interface, bdaddr, SDP_RETRY_IF_BUSY); +- if (!sess) { +- smprintf(s, "Failed to connect to SDP server on %s: %s\n", str, strerror(errno)); +- return ERR_TIMEOUT; +- } +- +- /* List available channels */ +- attrid = sdp_list_append(0, &range); +- search = sdp_list_append(0, group); +- if (sdp_service_search_attr_req(sess, search, SDP_ATTR_REQ_RANGE, attrid, &seq)) { +- smprintf(s, "Service Search failed: %s\n", strerror(errno)); +- sdp_close(sess); +- return ERR_UNKNOWN; +- } +- sdp_list_free(attrid, 0); +- sdp_list_free(search, 0); +- +- for (; seq; seq = next) { +- rec = (sdp_record_t *) seq->data; ++ bdaddr_t remote; ++ uint8_t buffer[1024]; ++ void *ss = NULL; + +- /* Get channel info */ +- if (sdp_get_access_protos(rec, &proto) == 0) { +- channel = sdp_get_proto_port(proto, RFCOMM_UUID); +- sdp_list_foreach(proto, (sdp_list_func_t)sdp_list_free, 0); +- sdp_list_free(proto, 0); +- } else { +- goto next_seq; +- } +- smprintf(s, " Channel %i", channel); ++ uint8_t *valptr, *dumpptr; ++ int i; ++ uint8_t v; + +- /* Get service name and check it */ +- d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY); +- if (d) { +- score = bluetooth_checkservicename(s, d->val.str); +- smprintf(s," - \"%s\" (score=%d)\n", d->val.str, score); +- if (score > bestscore) { +- found = channel; +- bestscore = score; +- } +- } else { +- smprintf(s,"\n"); +- } ++ uint8_t const *start, *end, *param_end; ++ uint32_t type, prot_type, param_type; ++ uint32_t len, prot_len, param_len; ++ int param; ++ union { ++ uint8_t uint8; ++ uint16_t uint16; ++ uint32_t uint32; ++ uint64_t uint64; ++ int128_t int128; ++ } prot_value, param_value; ++ ++ ++ uint8_t channel; ++ uint16_t serv = SDP_SERVICE_CLASS_OBEX_FILE_TRANSFER; ++ uint32_t attr = SDP_ATTR_RANGE( ++ SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST, ++ SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST); ++ sdp_attr_t proto = { SDP_ATTR_INVALID, 0, sizeof(buffer), buffer }; ++ + +- /* Descent to subroups */ +- memset(&subgroup, 0, sizeof(subgroup)); +- if (sdp_get_group_id(rec, &subgroup) != -1) { +- if (subgroup.value.uuid16 != group->value.uuid16) { +- bluetooth_checkdevice(s, bdaddr, &subgroup); +- } +- } +- +-next_seq: +- next = seq->next; +- free(seq); +- sdp_record_free(rec); ++ if (bt_aton(s->CurrentConfig->Device, &remote) < 1) { ++ smprintf(s, "Cannot parse MAC address: %s\n", s->CurrentConfig->Device); ++ return ERR_UNKNOWN; + } +- sdp_close(sess); ++ smprintf(s, "Device %s\n", s->CurrentConfig->Device); + +- if (found != -1) { +- return bluetooth_connect(s, found, str); ++ if ((ss = sdp_open(NG_HCI_BDADDR_ANY, &remote)) == NULL) { ++ smprintf(s, "Error opening SDP: %s\n", strerror(errno)); ++ return ERR_UNKNOWN; ++ } ++ if (sdp_error(ss) != 0) { ++ smprintf(s, "Error connecting to SDP: %d\n", sdp_error(ss)); ++ return ERR_UNKNOWN; ++ } ++ if (sdp_search(ss, 1, &serv, 1, &attr, 1, &proto) != 0) { ++ smprintf(s, "SDP search failed: %d\n", sdp_error(ss)); ++ return ERR_UNKNOWN; ++ } ++ if (proto.flags != SDP_ATTR_OK) { ++ smprintf(s, "SDP service not found: %d\n", proto.flags); ++ return ERR_NOTSUPPORTED; ++ } ++ valptr = (uint8_t *)proto.value; ++ dumpptr = (uint8_t *)proto.value; ++ smprintf(s, "SDP response vlen=%d\n", proto.vlen); ++ smprintf(s, "SDP response: "); ++ for (i = 0; i < proto.vlen; i ++) { ++ SDP_GET8(v, dumpptr); ++ smprintf(s, "%02x ", v); + } ++ smprintf(s, "\n"); + +- return ERR_NOTSUPPORTED; +-} ++ start = (uint8_t const *)proto.value; ++ end = start + proto.vlen; ++ if (end - start < 2) { ++ smprintf(s, "Invalid Protocol Descriptor List. " \ ++ "Too short, len=%zd\n", end - start); ++ return ERR_NOTSUPPORTED; ++ } + +-GSM_Error bluetooth_findchannel(GSM_StateMachine *s) +-{ +- inquiry_info ii[20]; +- uint8_t count = 0; +- int i; +- GSM_Error error = ERR_TIMEOUT; +- struct hci_dev_info di; +- uuid_t group; +- +- memset(&group, 0, sizeof(group)); +- /* We're looking only for rfcomm channels */ +- sdp_uuid16_create(&group, RFCOMM_UUID); +- +- if (hci_devinfo(0, &di) < 0) return ERR_DEVICENOTWORK; +- +- if (strcmp(s->CurrentConfig->Device, "/dev/ttyS1") == 0) { +- dbgprintf("Searching for devices\n"); +- if (sdp_general_inquiry(ii, 20, 8, &count) < 0) { +- return ERR_UNKNOWN; ++ SDP_GET8(type, start); ++ switch (type) { ++ case SDP_DATA_SEQ8: ++ SDP_GET8(len, start); ++ break; ++ ++ case SDP_DATA_SEQ16: ++ SDP_GET16(len, start); ++ break; ++ ++ case SDP_DATA_SEQ32: ++ SDP_GET32(len, start); ++ break; ++ ++ default: ++ smprintf(s, "Invalid Protocol Descriptor List. " \ ++ "Not a sequence, type=%#x\n", type); ++ return ERR_NOTSUPPORTED; ++ /* NOT REACHED */ ++ } ++ ++ while (start < end) { ++ SDP_GET8(type, start); ++ switch (type) { ++ case SDP_DATA_SEQ8: ++ SDP_GET8(prot_len, start); ++ break; ++ ++ case SDP_DATA_SEQ16: ++ SDP_GET16(prot_len, start); ++ break; ++ ++ case SDP_DATA_SEQ32: ++ SDP_GET32(prot_len, start); ++ break; ++ ++ default: ++ smprintf(s, "Invalid Protocol Descriptor List. " \ ++ "Not a sequence, type=%#x\n", type); ++ return ERR_NOTSUPPORTED; ++ /* NOT REACHED */ ++ } ++ ++ /* print_protocol_descriptor(start, start + len); */ ++ param_end = start + prot_len; ++ ++ /* Get Protocol UUID */ ++ SDP_GET8(prot_type, start); ++ switch (prot_type) { ++ case SDP_DATA_UUID16: ++ SDP_GET16(prot_value.uint16, start); ++ break; ++ ++ case SDP_DATA_UUID32: ++ SDP_GET32(prot_value.uint32, start); ++ break; ++ ++ case SDP_DATA_UUID128: ++ SDP_GET_UUID128(&prot_value.int128, start); ++ break; ++ ++ default: ++ smprintf(s, "Invalid Protocol Descriptor. " \ ++ "Not a UUID, type=%#x\n", prot_type); ++ return ERR_NOTSUPPORTED; ++ /* NOT REACHED */ + } +- } else { +- count = 1; +- str2ba(s->CurrentConfig->Device,&ii[0].bdaddr); +- } +- for (i=0;iCurrentConfig->Device); + } + + #endif diff -ruN --exclude=CVS /usr/ports/comms/gammu/files/patch-common.CMakeLists.txt /usr/home/saper/FreeBSD/ports/gammu/files/patch-common.CMakeLists.txt --- /usr/ports/comms/gammu/files/patch-common.CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100 +++ /usr/home/saper/FreeBSD/ports/gammu/files/patch-common.CMakeLists.txt 2009-01-13 05:08:25.093546000 +0100 @@ -0,0 +1,14 @@ +--- common/CMakeLists.txt.orig 2009-01-13 05:07:42.623430003 +0100 ++++ common/CMakeLists.txt 2009-01-13 05:07:24.000000000 +0100 +@@ -92,6 +92,11 @@ + include_directories (${FBSD_BLUE_INCLUDE_DIR}) + endif (FBSD_BLUE_FOUND) + ++if (FBSD_SDP_FOUND) ++ target_link_libraries (libGammu ${FBSD_SDP_LIBRARIES}) ++ include_directories (${FBSD_SDP_INCLUDE_DIR}) ++endif (FBSD_SDP_FOUND) ++ + if (OSX_BLUE_FOUND) + target_link_libraries (libGammu ${OSX_BLUE_LIBS}) + include_directories (${OSX_BLUE_INCLUDE_DIR}) ===> Done --------------070807010003080108040708--