build: Add skeleton for BlueZ Android
Subsystems (2)
PATCH v4 1/7 build: Add skeleton for BlueZ Android
Retrieve Bluetooth version from configure.ac.
--- Makefile.am | 4 +++- Makefile.android | 1 + android/Android.mk | 4 ++++ bootstrap-configure | 1 + configure.ac | 5 +++++ 5 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Makefile.android create mode 100644 android/Android.mk
Makefile.am +3 -1
@@ -179,6 +179,7 @@ test_scripts = include Makefile.tools include Makefile.obexd +include Makefile.android if HID2HCI rulesdir = @UDEV_DIR@/rules.d
@@ -293,7 +294,8 @@ pkgconfig_DATA = lib/bluez.pc endif DISTCHECK_CONFIGURE_FLAGS = --disable-datafiles --enable-library \ - --disable-systemd --disable-udev + --disable-systemd --disable-udev \ + --enable-android DISTCLEANFILES = $(pkgconfig_DATA)
Makefile.android new file +1 -0
@@ -0,0 +1 @@ +EXTRA_DIST += android/Android.mk
android/Android.mk new file +4 -0
@@ -0,0 +1,4 @@ +LOCAL_PATH := $(call my-dir) + +# Retrieve BlueZ version from configure.ac file +BLUEZ_VERSION := $(shell grep ^AC_INIT $(LOCAL_PATH)/../configure.ac | cpp -P -D'AC_INIT(_,v)=v')
bootstrap-configure +1 -0
@@ -12,4 +12,5 @@ fi --sysconfdir=/etc \ --localstatedir=/var \ --enable-experimental \ + --enable-android \ --disable-datafiles $*
configure.ac +5 -0
@@ -242,4 +242,9 @@ AC_DEFINE_UNQUOTED(CONFIGDIR, "${configdir}", [Directory for the configuration files]) AC_SUBST(CONFIGDIR, "${configdir}") +AC_ARG_ENABLE(android, AC_HELP_STRING([--enable-android], + [enable BlueZ for Android]), + [enable_android=${enableval}]) +AM_CONDITIONAL(ANDROID, test "${enable_android}" = "yes") + AC_OUTPUT(Makefile src/bluetoothd.8 lib/bluez.pc)
Signature · 1 line
1.7.9.5
PATCH v4 2/7 android: Add skeleton of BlueZ Android daemon
--- android/main.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 android/main.c
android/main.c new file +110 -0
@@ -0,0 +1,110 @@ +/* +* +* BlueZ - Bluetooth protocol stack for Linux +* +* Copyright (C) 2013 Intel Corporation. All rights reserved. +* +* +* 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 <signal.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> + +#include <glib.h> + +#define SHUTDOWN_GRACE_SECONDS 10 + +static GMainLoop *event_loop; + +static gboolean quit_eventloop (gpointer user_data) +{ +g_main_loop_quit (event_loop); + +return FALSE; +} + +static void sig_term (int sig) +{ +static bool __terminated = false; + +if (!__terminated) { +g_timeout_add_seconds (SHUTDOWN_GRACE_SECONDS , + quit_eventloop,NULL ); + } + + __terminated = true; +} + +static gboolean option_detach = TRUE; +static gboolean option_version = FALSE; + +static GOptionEntry options[] = { + {"nodetach" ,'n' ,G_OPTION_FLAG_REVERSE , +G_OPTION_ARG_NONE , &option_detach, +"Run with logging in foreground" ,NULL }, + {"version" ,'v' ,0 ,G_OPTION_ARG_NONE , &option_version, +"Show version information and exit" ,NULL }, + {NULL } +}; + +int main (int argc,char *argv[]) +{ +GOptionContext *context; +GError *err =NULL ; +struct sigaction sa; + + context =g_option_context_new (NULL ); +g_option_context_add_main_entries (context, options,NULL ); + +if (g_option_context_parse (context, &argc, &argv, &err) == FALSE) { +if (err !=NULL ) { +g_printerr ("%s\n" , err->message); +g_error_free (err); + }else +g_printerr ("An unknown error occurred\n" ); + +exit (EXIT_FAILURE ); + } + +g_option_context_free (context); + +if (option_version == TRUE) { +printf ("%s\n" ,VERSION ); +exit (EXIT_SUCCESS ); + } + + event_loop =g_main_loop_new (NULL , FALSE); + +memset (&sa,0 ,sizeof (sa)); + sa.sa_handler = sig_term; +sigaction (SIGINT , &sa,NULL ); +sigaction (SIGTERM , &sa,NULL ); + +g_main_loop_run (event_loop); + +g_main_loop_unref (event_loop); + +return EXIT_SUCCESS ; +}
Signature · 1 line
1.7.9.5
PATCH v4 3/7 android-build: Add BlueZ Android daemon
In reply to Frederic DanisDefine local mapping to glib path, otherwise this has to be inside central place in the build repository.
--- android/Android.mk | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
android/Android.mk +25 -0
@@ -2,3 +2,28 @@ LOCAL_PATH := $(call my-dir) # Retrieve BlueZ version from configure.ac file BLUEZ_VERSION := $(shell grep ^AC_INIT $(LOCAL_PATH)/../configure.ac | cpp -P -D'AC_INIT(_,v)=v') + +# Specify pathmap for glib +pathmap_INCL += glib:external/bluetooth/glib + +# +# Android BlueZ daemon (bluetoothd) +# + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + main.c \ + +LOCAL_C_INCLUDES := \ + $(call include-path-for, glib) \ + $(call include-path-for, glib)/glib \ + +LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\" + +LOCAL_SHARED_LIBRARIES := \ + libglib \ + +LOCAL_MODULE := bluetoothd + +include $(BUILD_EXECUTABLE)
Signature · 1 line
1.7.9.5
PATCH v4 4/7 build: Add BlueZ Android daemon
In reply to Frederic Danis--- .gitignore | 2 ++ Makefile.android | 7 +++++++ 2 files changed, 9 insertions(+)
.gitignore +2 -0
@@ -98,3 +98,5 @@ unit/test-gobex-packet unit/test-gobex-transfer unit/test-*.log unit/test-*.trs + +android/bluetoothd
Makefile.android +7 -0
@@ -1 +1,8 @@ +if ANDROID +noinst_PROGRAMS += android/bluetoothd + +android_bluetoothd_SOURCES = android/main.c +android_bluetoothd_LDADD = @GLIB_LIBS@ +endif + EXTRA_DIST += android/Android.mk
Signature · 1 line
1.7.9.5
PATCH v4 5/7 android: Android version of log.c
In reply to Frederic Danis--- android/log.c | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ android/main.c | 34 +++++++++++ 2 files changed, 206 insertions(+) create mode 100644 android/log.c
android/log.c new file +172 -0
@@ -0,0 +1,172 @@ +/* +* +* BlueZ - Bluetooth protocol stack for Linux +* +* Copyright (C) 2013 Intel Corporation. All rights reserved. +* +* +* 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 <fcntl.h> +#include <stdio.h> +#include <stdarg.h> +#include <unistd.h> +#include <sys/uio.h> + +#include <glib.h> + +#include "log.h" + +#define LOG_DEBUG 3 +#define LOG_INFO 4 +#define LOG_WARN 5 +#define LOG_ERR 6 + +static const char tag[] ="BlueZ" ; +static int system_fd; + +static void android_log (int pri,const char *fmt,va_list ap) +{ +char *msg; +struct iovec vec[3 ]; + +if (system_fd ==-1 ) +return ; + + msg =g_strdup_vprintf (fmt, ap); + + vec[0 ].iov_base = (unsigned char *) &pri; + vec[0 ].iov_len =1 ; + vec[1 ].iov_base = (void *) tag; + vec[1 ].iov_len =strlen (tag) +1 ; + vec[2 ].iov_base = (void *) msg; + vec[2 ].iov_len =strlen (msg) +1 ; + +writev (system_fd, vec,3 ); + +g_free (msg); +} + +void info (const char *format, ...) +{ +va_list ap; + +va_start (ap, format); + +android_log (LOG_INFO , format, ap); + +va_end (ap); +} + +void warn (const char *format, ...) +{ +va_list ap; + +va_start (ap, format); + +android_log (LOG_WARN , format, ap); + +va_end (ap); +} + +void error (const char *format, ...) +{ +va_list ap; + +va_start (ap, format); + +android_log (LOG_ERR , format, ap); + +va_end (ap); +} + +void btd_debug (const char *format, ...) +{ +va_list ap; + +va_start (ap, format); + +android_log (LOG_DEBUG , format, ap); + +va_end (ap); +} + +extern struct btd_debug_desc __start___debug[]; +extern struct btd_debug_desc __stop___debug[]; + +static char **enabled =NULL ; + +static gboolean is_enabled (struct btd_debug_desc *desc) +{ +int i; + +if (enabled ==NULL ) +return 0 ; + +for (i =0 ; enabled[i] !=NULL ; i++) +if (desc->file !=NULL &&g_pattern_match_simple (enabled[i], + desc->file) == TRUE) +return 1 ; + +return 0 ; +} + +void __btd_enable_debug (struct btd_debug_desc *start, +struct btd_debug_desc *stop) +{ +struct btd_debug_desc *desc; + +if (start ==NULL || stop ==NULL ) +return ; + +for (desc = start; desc < stop; desc++) { +if (is_enabled (desc)) + desc->flags |=BTD_DEBUG_FLAG_PRINT ; + } +} + +void __btd_toggle_debug (void ) +{ +struct btd_debug_desc *desc; + +for (desc = __start___debug; desc < __stop___debug; desc++) + desc->flags |=BTD_DEBUG_FLAG_PRINT ; +} + +void __btd_log_init (const char *debug,int detach) +{ +if (debug !=NULL ) + enabled =g_strsplit_set (debug,":, " ,0 ); + +__btd_enable_debug (__start___debug, __stop___debug); + + system_fd =open ("/dev/log/system" ,O_WRONLY ); + +info ("Bluetooth daemon %s" ,VERSION ); +} + +void __btd_log_cleanup (void ) +{ +close (system_fd); + system_fd =-1 ; + +g_strfreev (enabled); +}
android/main.c +34 -0
@@ -34,6 +34,8 @@#include <glib.h> +#include "log.h" +#define SHUTDOWN_GRACE_SECONDS 10static GMainLoop *event_loop;
@@ -57,10 +59,31 @@ static void sig_term(int sig) __terminated = true; } +static char *option_debug =NULL ;static gboolean option_detach = TRUE;static gboolean option_version = FALSE; +static void free_options (void ) +{ +g_free (option_debug); + option_debug =NULL ; +} + +static gboolean parse_debug (const char *key,const char *value, +gpointer user_data,GError **error) +{ +if (value) + option_debug =g_strdup (value); +else + option_debug =g_strdup ("*" ); + +return TRUE; +} +static GOptionEntry options[] = { + {"debug" ,'d' ,G_OPTION_FLAG_OPTIONAL_ARG , +G_OPTION_ARG_CALLBACK , parse_debug, +"Specify debug options to enable" ,"DEBUG" }, {"nodetach" ,'n' ,G_OPTION_FLAG_REVERSE ,G_OPTION_ARG_NONE , &option_detach,"Run with logging in foreground" ,NULL },
@@ -102,9 +125,20 @@ int main(int argc, char *argv[])sigaction (SIGINT , &sa,NULL );sigaction (SIGTERM , &sa,NULL ); +__btd_log_init (option_debug, option_detach); + +/* no need to keep parsed option in memory */ +free_options (); + +DBG ("Entering main loop" ); +g_main_loop_run (event_loop);g_main_loop_unref (event_loop); +info ("Exit" ); + +__btd_log_cleanup (); +return EXIT_SUCCESS ; }
Signature · 1 line
1.7.9.5
Re: [PATCH v4 5/7] android: Android version of log.c
Quoted 5 lines · Frederic Danis
--- android/log.c | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ android/main.c | 34 +++++++++++ 2 files changed, 206 insertions(+) create mode 100644 android/log.c
What is the status with review. Do I understand correctly that it needs to be changed something like:
void info(const char *format, ...)
{
va_list ap;
va_start(ap, format);- android_log(LOG_INFO, format, ap); + vfprintf(stderr, format, ap); + fprintf(stderr, "\n");
va_end(ap);
}
If so I can change this myself and resend patch series.
Best regards
Andrei Emeltchenko
PATCH v4 6/7 android-build: Add logging system
In reply to Frederic Danis--- android/Android.mk | 2 ++ 1 file changed, 2 insertions(+)
android/Android.mk +2 -0
@@ -14,10 +14,12 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := \ main.c \ + log.c \ LOCAL_C_INCLUDES := \ $(call include-path-for, glib) \ $(call include-path-for, glib)/glib \ + $(LOCAL_PATH)/../src \ LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
Signature · 1 line
1.7.9.5
PATCH v4 7/7 build: Add logging system
In reply to Frederic Danis--- Makefile.android | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Makefile.android +2 -2
@@ -1,8 +1,8 @@ if ANDROID noinst_PROGRAMS += android/bluetoothd -android_bluetoothd_SOURCES = android/main.c +android_bluetoothd_SOURCES = android/main.c src/log.c android_bluetoothd_LDADD = @GLIB_LIBS@ endif -EXTRA_DIST += android/Android.mk +EXTRA_DIST += android/Android.mk android/log.c
Signature · 1 line
1.7.9.5