diff options
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | acinclude.m4 | 13 | ||||
-rw-r--r-- | configure.in | 1 | ||||
-rw-r--r-- | transfer/Makefile.am | 21 | ||||
-rw-r--r-- | transfer/main.c | 189 | ||||
-rw-r--r-- | transfer/process.c | 124 | ||||
-rw-r--r-- | transfer/process.h | 25 | ||||
-rw-r--r-- | transfer/server.c | 281 | ||||
-rw-r--r-- | transfer/server.h | 25 | ||||
-rw-r--r-- | transfer/session.c | 242 | ||||
-rw-r--r-- | transfer/session.h | 40 | ||||
-rw-r--r-- | transfer/transfer-api.txt | 20 | ||||
-rw-r--r-- | transfer/transfer.service | 4 |
13 files changed, 1 insertions, 986 deletions
diff --git a/Makefile.am b/Makefile.am index 8ce19cddb..4a91fb8ab 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@ SUBDIRS = doc sbc eglib common sdpd hcid daemon plugins \ - transfer network serial input audio print sync \ + network serial input audio print sync \ tools rfcomm dund pand hidd \ cups test scripts diff --git a/acinclude.m4 b/acinclude.m4 index 2e0c58c5f..79c72825d 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -107,12 +107,6 @@ AC_DEFUN([AC_PATH_GMODULE], [ AC_SUBST(GMODULE_LIBS) ]) -AC_DEFUN([AC_PATH_OPENOBEX], [ - PKG_CHECK_MODULES(OPENOBEX, openobex > 1.1, openobex_found=yes, openobex_found=no) - AC_SUBST(OPENOBEX_CFLAGS) - AC_SUBST(OPENOBEX_LIBS) -]) - AC_DEFUN([AC_PATH_OPENSYNC], [ PKG_CHECK_MODULES(OPENSYNC, glib-2.0 opensync-1.0 osengine-1.0, opensync_found=yes, opensync_found=no) AC_SUBST(OPENSYNC_CFLAGS) @@ -176,7 +170,6 @@ AC_DEFUN([AC_ARG_BLUEZ], [ hal_enable=${hal_found} usb_enable=${usb_found} alsa_enable=${alsa_found} - obex_enable=${openobex_found} glib_enable=no gstreamer_enable=${gstreamer_found} audio_enable=yes @@ -216,7 +209,6 @@ AC_DEFUN([AC_ARG_BLUEZ], [ AC_ARG_ENABLE(all, AC_HELP_STRING([--enable-all], [enable all extra options below]), [ dbus_enable=${enableval} - obex_enable=${enableval} alsa_enable=${enableval} hcid_enable=${enableval} sdpd_enable=${enableval} @@ -253,10 +245,6 @@ AC_DEFUN([AC_ARG_BLUEZ], [ alsa_enable=${enableval} ]) - AC_ARG_ENABLE(obex, AC_HELP_STRING([--enable-obex], [enable OBEX support]), [ - obex_enable=${enableval} - ]) - AC_ARG_ENABLE(glib, AC_HELP_STRING([--enable-glib], [enable GLib support]), [ glib_enable=${enableval} ]) @@ -395,7 +383,6 @@ AC_DEFUN([AC_ARG_BLUEZ], [ AM_CONDITIONAL(USB, test "${usb_enable}" = "yes" && test "${usb_found}" = "yes") AM_CONDITIONAL(SBC, test "${alsa_enable}" = "yes" || test "${gstreamer_enable}" = "yes") AM_CONDITIONAL(ALSA, test "${alsa_enable}" = "yes" && test "${alsa_found}" = "yes") - AM_CONDITIONAL(OBEX, test "${obex_enable}" = "yes" && test "${openobex_found}" = "yes") AM_CONDITIONAL(GSTREAMER, test "${gstreamer_enable}" = "yes" && test "${gstreamer_found}" = "yes") AM_CONDITIONAL(AUDIOSERVICE, test "${audio_enable}" = "yes") AM_CONDITIONAL(INPUTSERVICE, test "${input_enable}" = "yes") diff --git a/configure.in b/configure.in index 0058b9a95..d8a7aaf0c 100644 --- a/configure.in +++ b/configure.in @@ -45,7 +45,6 @@ AC_OUTPUT([ common/Makefile daemon/Makefile plugins/Makefile - transfer/Makefile network/Makefile serial/Makefile input/Makefile diff --git a/transfer/Makefile.am b/transfer/Makefile.am deleted file mode 100644 index 0dae6c092..000000000 --- a/transfer/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ - -if OBEX -servicedir = $(libdir)/bluetooth - -noinst_PROGRAMS = bluetoothd-service-transfer - -bluetoothd_service_transfer_SOURCES = main.c \ - server.h server.c session.h session.c \ - process.h process.c - -LDADD = $(top_builddir)/common/libhelper.a \ - @GLIB_LIBS@ @DBUS_LIBS@ @OPENOBEX_LIBS@ @BLUEZ_LIBS@ -endif - -AM_CFLAGS = @BLUEZ_CFLAGS@ @OPENOBEX_CFLAGS@ @DBUS_CFLAGS@ @GLIB_CFLAGS@ - -INCLUDES = -I$(top_srcdir)/common - -EXTRA_DIST = transfer.service transfer-api.txt - -MAINTAINERCLEANFILES = Makefile.in diff --git a/transfer/main.c b/transfer/main.c deleted file mode 100644 index 4b0015fc7..000000000 --- a/transfer/main.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2006-2008 Marcel Holtmann <marcel@holtmann.org> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdlib.h> -#include <stdint.h> -#include <signal.h> - -#include <glib.h> - -#include <dbus/dbus.h> - -#include "logging.h" -#include "dbus.h" - -#include "server.h" -#include "session.h" - -#define SERVICE_PATH "/org/bluez/transfer" - -static GMainLoop *main_loop; - -static DBusConnection *system_bus; - -static DBusHandlerResult error_reply(DBusConnection *conn, - DBusMessage *msg, const char *str) -{ - return send_message_and_unref(conn, - dbus_message_new_error(msg, "org.bluez.transfer.Error", str)); -} - -static DBusHandlerResult push_message(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessage *reply; - const char *address, *pathname, *identifier; - struct session_data *session; - - if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address, - DBUS_TYPE_STRING, &pathname, DBUS_TYPE_INVALID) == FALSE) - return error_reply(conn, msg, "Invalid arguments"); - - debug("Requesting push of %s to %s", pathname, address); - - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - session = session_create(conn, msg); - if (!session) { - dbus_message_unref(reply); - return DBUS_HANDLER_RESULT_NEED_MEMORY; - } - - identifier = session_connect(session, address, pathname); - if (!identifier) { - session_destroy(session); - dbus_message_unref(reply); - return error_reply(conn, msg, "Unable to connect session"); - } - - debug("Created new session at %s", identifier); - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &identifier, - DBUS_TYPE_INVALID); - - dbus_connection_send(conn, reply, NULL); - - dbus_message_unref(reply); - - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult manager_handler(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - if (dbus_message_is_method_call(msg, "org.bluez.transfer.Manager", "Push")) - return push_message(conn, msg, data); - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -static DBusObjectPathVTable manager_table = { - .message_function = manager_handler, -}; - -static int setup_manager(void) -{ - if (dbus_connection_register_object_path(system_bus, - SERVICE_PATH, &manager_table, NULL) == FALSE) { - error("Service path registration failed"); - return -1; - } - - return 0; -} - -static void sig_term(int sig) -{ - g_main_loop_quit(main_loop); -} - -static void sig_hup(int sig) -{ -} - -static void sig_debug(int sig) -{ - toggle_debug(); -} - -int main(int argc, char *argv[]) -{ - struct sigaction sa; - - start_logging("transfer", "Bluetooth transfer service ver %s", VERSION); - - memset(&sa, 0, sizeof(sa)); - sa.sa_flags = SA_NOCLDSTOP; - sa.sa_handler = sig_term; - sigaction(SIGTERM, &sa, NULL); - sigaction(SIGINT, &sa, NULL); - sa.sa_handler = sig_hup; - sigaction(SIGHUP, &sa, NULL); - - sa.sa_handler = sig_debug; - sigaction(SIGUSR2, &sa, NULL); - - sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, &sa, NULL); - sigaction(SIGPIPE, &sa, NULL); - - enable_debug(); - - main_loop = g_main_loop_new(NULL, FALSE); - - system_bus = init_dbus(NULL, NULL, NULL); - if (!system_bus) { - g_main_loop_unref(main_loop); - exit(1); - } - - if (setup_manager() < 0) { - dbus_connection_unref(system_bus); - g_main_loop_unref(main_loop); - exit(1); - } - - start_server(9); - - g_main_loop_run(main_loop); - - stop_server(); - - dbus_connection_unregister_object_path(system_bus, SERVICE_PATH); - - dbus_connection_unref(system_bus); - - g_main_loop_unref(main_loop); - - info("Exit"); - - stop_logging(); - - return 0; -} diff --git a/transfer/process.c b/transfer/process.c deleted file mode 100644 index 0e401956c..000000000 --- a/transfer/process.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2006-2008 Marcel Holtmann <marcel@holtmann.org> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <errno.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <sys/wait.h> - -#include <glib.h> - -#include "logging.h" -#include "process.h" - -static void child_exit(GPid pid, gint status, gpointer data) -{ - debug("Child with PID %d exits with status %d", pid, status); - - debug("Exit status %d", WEXITSTATUS(status)); -} - -int create_reader(uid_t uid, const char *pathname, - GIOFunc func, gpointer user_data) -{ - pid_t pid; - unsigned char buf[512]; - int fd, pfd[2], len, written; - - if (pipe(pfd) < 0) { - error("Failed to create new pipe"); - return -1; - } - - pid = fork(); - if (pid < 0) { - error("Failed to fork new process"); - close(pfd[0]); - close(pfd[1]); - return -1; - } - - if (pid > 0) { - GIOChannel *io; - - g_child_watch_add(pid, child_exit, NULL); - - close(pfd[1]); - - io = g_io_channel_unix_new(pfd[0]); - g_io_channel_set_close_on_unref(io, TRUE); - - g_io_add_watch(io, G_IO_IN | G_IO_ERR | G_IO_HUP, func, - user_data); - - g_io_channel_unref(io); - - return 0; - } - - /* Child process */ - - close(pfd[0]); - - if (setuid(uid) < 0) { - error("Failed to switch to UID %d", uid); - close(pfd[1]); - exit(EXIT_FAILURE); - } - - fd = open(pathname, O_RDONLY); - if (fd < 0) { - error("Failed to open file %s: %s", - pathname, strerror(errno)); - close(pfd[1]); - exit(EXIT_FAILURE); - } - - while (1) { - len = read(fd, buf, sizeof(buf)); - if (len <= 0) { - debug("Reading failed"); - break; - } - - written = write(pfd[1], buf, len); - if (written < len) { - debug("Writing failed"); - break; - } - } - - debug("Reader finished"); - - close(fd); - - close(pfd[1]); - - exit(EXIT_SUCCESS); -} diff --git a/transfer/process.h b/transfer/process.h deleted file mode 100644 index c6f877ec2..000000000 --- a/transfer/process.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2006-2008 Marcel Holtmann <marcel@holtmann.org> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -int create_reader(uid_t uid, const char *pathname, - GIOFunc func, gpointer user_data); diff --git a/transfer/server.c b/transfer/server.c deleted file mode 100644 index eb1bee0ad..000000000 --- a/transfer/server.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2006-2008 Marcel Holtmann <marcel@holtmann.org> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <unistd.h> -#include <sys/socket.h> - -#include <bluetooth/bluetooth.h> -#include <bluetooth/rfcomm.h> -#include <bluetooth/sdp.h> -#include <bluetooth/sdp_lib.h> - -#include <glib.h> - -#include "logging.h" -#include "server.h" - -static sdp_session_t *sdp_session = NULL; - -static gboolean session_event(GIOChannel *chan, GIOCondition cond, gpointer data) -{ - if (cond & (G_IO_HUP | G_IO_ERR)) - return FALSE; - - debug("Incoming data session"); - - return FALSE; -} - -static gboolean connect_event(GIOChannel *chan, GIOCondition cond, gpointer data) -{ - GIOChannel *io; - struct sockaddr_rc addr; - socklen_t optlen; - int sk, nsk; - - sk = g_io_channel_unix_get_fd(chan); - - memset(&addr, 0, sizeof(addr)); - optlen = sizeof(addr); - - nsk = accept(sk, (struct sockaddr *) &addr, &optlen); - if (nsk < 0) - return TRUE; - - io = g_io_channel_unix_new(nsk); - g_io_channel_set_close_on_unref(io, TRUE); - - g_io_add_watch(io, G_IO_IN | G_IO_HUP | G_IO_ERR, - session_event, NULL); - - g_io_channel_unref(io); - - return TRUE; -} - -static GIOChannel *setup_rfcomm(uint8_t channel) -{ - GIOChannel *io; - struct sockaddr_rc addr; - int sk; - - sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); - if (sk < 0) - return NULL; - - memset(&addr, 0, sizeof(addr)); - addr.rc_family = AF_BLUETOOTH; - bacpy(&addr.rc_bdaddr, BDADDR_ANY); - addr.rc_channel = channel; - - if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - close(sk); - return NULL; - } - - if (listen(sk, 10) < 0) { - close(sk); - return NULL; - } - - io = g_io_channel_unix_new(sk); - g_io_channel_set_close_on_unref(io, TRUE); - - g_io_add_watch(io, G_IO_IN, connect_event, NULL); - - return io; -} - -static int setup_sdp_for_push(uint8_t channel) -{ - sdp_record_t *record; - sdp_list_t *svclass_id, *pfseq, *apseq, *root; - uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid; - sdp_profile_desc_t profile[1]; - sdp_list_t *aproto, *proto[3]; - sdp_data_t *chan; - uint8_t formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xFF }; - void *dtds[sizeof(formats)], *values[sizeof(formats)]; - int i; - uint8_t dtd = SDP_UINT8; - sdp_data_t *sflist; - - if (!sdp_session) { - sdp_session = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, 0); - if (!sdp_session) { - error("Connection to SDP server failed"); - return -1; - } - } - - record = sdp_record_alloc(); - if (!record) { - error("Allocation of service record failed"); - return -1; - } - - sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP); - root = sdp_list_append(0, &root_uuid); - sdp_set_browse_groups(record, root); - - sdp_uuid16_create(&opush_uuid, OBEX_OBJPUSH_SVCLASS_ID); - svclass_id = sdp_list_append(0, &opush_uuid); - sdp_set_service_classes(record, svclass_id); - - sdp_uuid16_create(&profile[0].uuid, OBEX_OBJPUSH_PROFILE_ID); - profile[0].version = 0x0100; - pfseq = sdp_list_append(0, profile); - sdp_set_profile_descs(record, pfseq); - - sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID); - proto[0] = sdp_list_append(0, &l2cap_uuid); - apseq = sdp_list_append(0, proto[0]); - - sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID); - proto[1] = sdp_list_append(0, &rfcomm_uuid); - chan = sdp_data_alloc(SDP_UINT8, &channel); - proto[1] = sdp_list_append(proto[1], chan); - apseq = sdp_list_append(apseq, proto[1]); - - sdp_uuid16_create(&obex_uuid, OBEX_UUID); - proto[2] = sdp_list_append(0, &obex_uuid); - apseq = sdp_list_append(apseq, proto[2]); - - aproto = sdp_list_append(0, apseq); - sdp_set_access_protos(record, aproto); - - for (i = 0; i < sizeof(formats); i++) { - dtds[i] = &dtd; - values[i] = &formats[i]; - } - sflist = sdp_seq_alloc(dtds, values, sizeof(formats)); - sdp_attr_add(record, SDP_ATTR_SUPPORTED_FORMATS_LIST, sflist); - - sdp_set_info_attr(record, "OBEX Object Push", 0, 0); - - if (sdp_record_register(sdp_session, record, 0) < 0) { - error("Registration of service record failed"); - sdp_record_free(record); - return -1; - } - - sdp_record_free(record); - - return 0; -} - -static int setup_sdp_for_ftp(uint8_t channel) -{ - sdp_record_t *record; - sdp_list_t *svclass_id, *pfseq, *apseq, *root; - uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid; - sdp_profile_desc_t profile[1]; - sdp_list_t *aproto, *proto[3]; - sdp_data_t *chan; - - if (!sdp_session) { - sdp_session = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, 0); - if (!sdp_session) { - error("Connection to SDP server failed"); - return -1; - } - } - - record = sdp_record_alloc(); - if (!record) { - error("Allocation of service record failed"); - return -1; - } - - sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP); - root = sdp_list_append(0, &root_uuid); - sdp_set_browse_groups(record, root); - - sdp_uuid16_create(&opush_uuid, OBEX_FILETRANS_SVCLASS_ID); - svclass_id = sdp_list_append(0, &opush_uuid); - sdp_set_service_classes(record, svclass_id); - - sdp_uuid16_create(&profile[0].uuid, OBEX_FILETRANS_PROFILE_ID); - profile[0].version = 0x0100; - pfseq = sdp_list_append(0, profile); - sdp_set_profile_descs(record, pfseq); - - sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID); - proto[0] = sdp_list_append(0, &l2cap_uuid); - apseq = sdp_list_append(0, proto[0]); - - sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID); - proto[1] = sdp_list_append(0, &rfcomm_uuid); - chan = sdp_data_alloc(SDP_UINT8, &channel); - proto[1] = sdp_list_append(proto[1], chan); - apseq = sdp_list_append(apseq, proto[1]); - - sdp_uuid16_create(&obex_uuid, OBEX_UUID); - proto[2] = sdp_list_append(0, &obex_uuid); - apseq = sdp_list_append(apseq, proto[2]); - - aproto = sdp_list_append(0, apseq); - sdp_set_access_protos(record, aproto); - - sdp_set_info_attr(record, "OBEX File Transfer", 0, 0); - - if (sdp_record_register(sdp_session, record, 0) < 0) { - error("Registration of service record failed"); - sdp_record_free(record); - return -1; - } - - sdp_record_free(record); - - return 0; -} - -static GIOChannel *server_io = NULL; - -int start_server(uint8_t channel) -{ - server_io = setup_rfcomm(channel); - if (!server_io) - return -1; - - if (setup_sdp_for_push(channel) < 0) { - g_io_channel_unref(server_io); - server_io = NULL; - } - - setup_sdp_for_ftp(channel); - - return 0; -} - -void stop_server(void) -{ - sdp_close(sdp_session); - - if (server_io) - g_io_channel_unref(server_io); -} diff --git a/transfer/server.h b/transfer/server.h deleted file mode 100644 index 6094fa017..000000000 --- a/transfer/server.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2006-2008 Marcel Holtmann <marcel@holtmann.org> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -int start_server(uint8_t channel); -void stop_server(void); diff --git a/transfer/session.c b/transfer/session.c deleted file mode 100644 index 74f34649e..000000000 --- a/transfer/session.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2006-2008 Marcel Holtmann <marcel@holtmann.org> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <errno.h> -#include <ctype.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> - -#include <bluetooth/bluetooth.h> -#include <bluetooth/rfcomm.h> - -#include <glib.h> - -#include <dbus/dbus.h> - -#include "logging.h" - -#include "process.h" -#include "session.h" - -static DBusHandlerResult cancel_message(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessage *reply; - struct session_data *session = data; - - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - - debug("Cancel of session at %s", session->identifier); - - dbus_message_append_args(reply, DBUS_TYPE_INVALID); - - dbus_connection_send(conn, reply, NULL); - - dbus_message_unref(reply); - - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult session_handler(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - if (dbus_message_is_method_call(msg, "org.bluez.transfer.Session", "Cancel")) - return cancel_message(conn, msg, data); - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -static DBusObjectPathVTable session_table = { - .message_function = session_handler, -}; - -struct session_data *session_create(DBusConnection *conn, DBusMessage *msg) -{ - struct session_data *session; - - session = malloc(sizeof(*session)); - if (!session) - return NULL; - - memset(session, 0, sizeof(*session)); - - session->conn = dbus_connection_ref(conn); - - session->msg = dbus_message_ref(msg); - - return session; -} - -void session_destroy(struct session_data *session) -{ - if (!session) - return; - - if (session->identifier) { - dbus_connection_unregister_object_path(session->conn, - session->identifier); - free(session->identifier); - } - - dbus_message_unref(session->msg); - - dbus_connection_unref(session->conn); - - free(session); -} - -static gboolean connect_callback(GIOChannel *chan, - GIOCondition cond, gpointer data) -{ - struct session_data *session = data; - int sk; - - debug("Connection for session %s established", session->identifier); - - sk = g_io_channel_unix_get_fd(session->rfcomm_io); - - close(sk); - - return FALSE; -} - -static int rfcomm_connect(struct session_data *session) -{ - struct sockaddr_rc addr; - long arg; - int sk; - - sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); - if (sk < 0) - return -1; - - arg = fcntl(sk, F_GETFL); - if (arg < 0) { - close(sk); - return -1; - } - - arg |= O_NONBLOCK; - - if (fcntl(sk, F_SETFL, arg) < 0) { - close(sk); - return -1; - } - - session->rfcomm_io = g_io_channel_unix_new(sk); - if (!session->rfcomm_io) { - close(sk); - return -1; - } - - g_io_channel_set_close_on_unref(session->rfcomm_io, TRUE); - - memset(&addr, 0, sizeof(addr)); - addr.rc_family = AF_BLUETOOTH; - bacpy(&addr.rc_bdaddr, &session->bdaddr); - addr.rc_channel = session->channel; - - if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - if (errno != EAGAIN && errno != EINPROGRESS) { - close(sk); - return -1; - } - } - - g_io_add_watch(session->rfcomm_io, G_IO_OUT, connect_callback, session); - - return 0; -} - -static gboolean data_event(GIOChannel *chan, GIOCondition cond, gpointer data) -{ - unsigned char buf[64]; - gsize len; - GIOError err; - int i; - - debug("Data event"); - - if (cond & (G_IO_HUP | G_IO_ERR)) - return FALSE; - - memset(buf, 0, sizeof(buf)); - - err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf) - 1, &len); - if (err == G_IO_ERROR_AGAIN) - return TRUE; - - for (i = 0; i < len; i++) - if (!isprint(buf[i])) - buf[i] = '.'; - - debug("%s", buf); - - return TRUE; -} - -const char *session_connect(struct session_data *session, - const char *address, const char *pathname) -{ - const char *sender; - char path[128]; - - sender = dbus_message_get_sender(session->msg); - - session->uid = dbus_bus_get_unix_user(session->conn, sender, NULL); - - debug("Request by user %d", session->uid); - - create_reader(session->uid, pathname, data_event, NULL); - - str2ba(address, &session->bdaddr); - - session->channel = 1; - - snprintf(path, sizeof(path), "/org/bluez/transfer/%d%d", - session->uid, rand()); - - session->identifier = strdup(path); - if (!session->identifier) - return NULL; - - if (dbus_connection_register_object_path(session->conn, path, - &session_table, session) == FALSE) { - free(session->identifier); - session->identifier = NULL; - return NULL; - } - - if (rfcomm_connect(session) < 0) - return NULL; - - return session->identifier; -} diff --git a/transfer/session.h b/transfer/session.h deleted file mode 100644 index 86357cbf3..000000000 --- a/transfer/session.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2006-2008 Marcel Holtmann <marcel@holtmann.org> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include <bluetooth/bluetooth.h> - -struct session_data { - DBusConnection *conn; - DBusMessage *msg; - uid_t uid; - bdaddr_t bdaddr; - uint8_t channel; - char *identifier; - GIOChannel *rfcomm_io; -}; - -struct session_data *session_create(DBusConnection *conn, DBusMessage *msg); -void session_destroy(struct session_data *session); - -const char *session_connect(struct session_data *session, - const char *address, const char *pathname); diff --git a/transfer/transfer-api.txt b/transfer/transfer-api.txt deleted file mode 100644 index 3deeb5dc5..000000000 --- a/transfer/transfer-api.txt +++ /dev/null @@ -1,20 +0,0 @@ -Bluetooth transfer service API description -****************************************** - -Copyright (C) 2006-2007 Marcel Holtmann <marcel@holtmann.org> - - -Manager hierarchy -================= - -Service org.bluez.transfer -Interface org.bluez.transfer.Manager -Object path /org/bluez/transfer - - -Session hierarchy -================= - -Service org.bluez.transfer -Interface org.bluez.transfer.Session -Object path /org/bluez/transfer/{session} diff --git a/transfer/transfer.service b/transfer/transfer.service deleted file mode 100644 index 2f7b8aa41..000000000 --- a/transfer/transfer.service +++ /dev/null @@ -1,4 +0,0 @@ -[Bluetooth Service] -Identifier=transfer -Name=Transfer service -Description=Bluetooth OBEX based Transfer service |