* [PATCH 1/2] Add conf file support
@ 2011-05-24 16:12 Luiz Augusto von Dentz
2011-05-24 16:12 ` [PATCH 2/2] Simplify options for including/excluding plugins Luiz Augusto von Dentz
2011-05-25 0:39 ` [PATCH 1/2] Add conf file support Marcel Holtmann
0 siblings, 2 replies; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2011-05-24 16:12 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This should reduce the amount of options which normally don't change
each time obexd is executed.
---
Makefile.am | 2 +-
plugins/ftp.c | 8 ++-
src/main.c | 173 +++++++++++++++++++++++++++++++++++++++-----------------
3 files changed, 127 insertions(+), 56 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 8d8fdc6..2b329a6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -138,7 +138,7 @@ INCLUDES = -I$(builddir)/src -I$(srcdir)/src -I$(srcdir)/plugins \
CLEANFILES = $(service_DATA) $(builtin_files)
-EXTRA_DIST = src/genbuiltin $(doc_files) $(test_files) src/obex.conf \
+EXTRA_DIST = src/genbuiltin $(doc_files) $(test_files) src/obexd.conf \
src/obexd.service.in client/obex-client.service.in \
plugins/phonebook-dummy.c plugins/phonebook-ebook.c \
plugins/phonebook-tracker.c \
diff --git a/plugins/ftp.c b/plugins/ftp.c
index 79223bf..879d9e9 100644
--- a/plugins/ftp.c
+++ b/plugins/ftp.c
@@ -179,8 +179,12 @@ static int get_by_type(struct ftp_session *ftp, const char *type)
if (type == NULL && name == NULL)
return -EBADR;
- if (g_strcmp0(type, CAP_TYPE) == 0)
- return obex_get_stream_start(os, capability);
+ if (g_strcmp0(type, CAP_TYPE) == 0) {
+ if (capability)
+ return obex_get_stream_start(os, capability);
+ else
+ return -ENOENT;
+ }
path = g_build_filename(ftp->folder, name, NULL);
err = obex_get_stream_start(os, path);
diff --git a/src/main.c b/src/main.c
index 8154e3b..6e8ef8d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -54,7 +54,81 @@
#define DEFAULT_ROOT_PATH "/tmp"
-#define DEFAULT_CAP_FILE CONFIGDIR "/capability.xml"
+static struct {
+ char *root_setup;
+ char *root_folder;
+ char *capability;
+ gboolean symlinks;
+} obexd_settings = {
+ .root_setup = NULL,
+ .root_folder = DEFAULT_ROOT_PATH,
+ .capability = NULL,
+ .symlinks = FALSE
+};
+
+static void parse_config(GKeyFile *config)
+{
+ GError *error = NULL;
+ char *string;
+ gboolean boolean;
+
+ string = g_key_file_get_string(config, "General",
+ "RootSetup", &error);
+ if (error == NULL)
+ obexd_settings.root_setup = string;
+ else
+ g_clear_error(&error);
+
+ string = g_key_file_get_string(config, "General",
+ "RootFolder", &error);
+ if (error == NULL) {
+ if (string[0] != '/') {
+ char *old_root = string, *home = getenv("HOME");
+ if (home) {
+ string = g_strdup_printf("%s/%s", home, old_root);
+ g_free(old_root);
+ }
+ }
+
+ obexd_settings.root_folder = string;
+ } else
+ g_clear_error(&error);
+
+ string = g_key_file_get_string(config, "General",
+ "Capability", &error);
+ if (error == NULL)
+ obexd_settings.capability = string;
+ else
+ g_clear_error(&error);
+
+ boolean = g_key_file_get_boolean(config, "General",
+ "Symlinks", &error);
+ if (error == NULL)
+ obexd_settings.symlinks = boolean;
+
+ g_clear_error(&error);
+}
+
+static void load_config(const char *file)
+{
+ GError *err = NULL;
+ GKeyFile *keyfile;
+
+ DBG("%s", file);
+
+ keyfile = g_key_file_new();
+
+ g_key_file_set_list_separator(keyfile, ',');
+
+ if (!g_key_file_load_from_file(keyfile, file, 0, &err)) {
+ error("Parsing %s failed: %s", file, err->message);
+ g_error_free(err);
+ g_key_file_free(keyfile);
+ return;
+ }
+
+ parse_config(keyfile);
+}
static GMainLoop *main_loop = NULL;
@@ -71,10 +145,7 @@ static void sig_debug(int sig)
static gboolean option_detach = TRUE;
static char *option_debug = NULL;
-
-static char *option_root = NULL;
-static char *option_root_setup = NULL;
-static char *option_capability = NULL;
+static char *option_config = NULL;
static gboolean option_autoaccept = FALSE;
static gboolean option_opp = FALSE;
@@ -82,7 +153,6 @@ static gboolean option_ftp = FALSE;
static gboolean option_pbap = FALSE;
static gboolean option_irmc = FALSE;
static gboolean option_pcsuite = FALSE;
-static gboolean option_symlinks = FALSE;
static gboolean option_syncevolution = FALSE;
static gboolean option_mas = FALSE;
@@ -97,6 +167,17 @@ static gboolean parse_debug(const char *key, const char *value,
return TRUE;
}
+static gboolean set_config(const char *key, const char *value,
+ gpointer user_data, GError **error)
+{
+ if (!value)
+ return FALSE;
+
+ option_config = g_strdup(value);
+
+ return TRUE;
+}
+
static GOptionEntry options[] = {
{ "nodaemon", 'n', G_OPTION_FLAG_REVERSE,
G_OPTION_ARG_NONE, &option_detach,
@@ -104,14 +185,9 @@ static GOptionEntry options[] = {
{ "debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
G_OPTION_ARG_CALLBACK, parse_debug,
"Enable debug information output", "DEBUG" },
- { "root", 'r', 0, G_OPTION_ARG_STRING, &option_root,
- "Specify root folder location", "PATH" },
- { "root-setup", 'S', 0, G_OPTION_ARG_STRING, &option_root_setup,
- "Root folder setup script", "SCRIPT" },
- { "symlinks", 'l', 0, G_OPTION_ARG_NONE, &option_symlinks,
- "Enable symlinks on root folder" },
- { "capability", 'c', 0, G_OPTION_ARG_STRING, &option_capability,
- "Specify capability file", "FILE" },
+ { "config", 'c', G_OPTION_FLAG_OPTIONAL_ARG,
+ G_OPTION_ARG_CALLBACK, set_config,
+ "Config file location", "FILE" },
{ "auto-accept", 'a', 0, G_OPTION_ARG_NONE, &option_autoaccept,
"Automatically accept push requests" },
{ "opp", 'o', 0, G_OPTION_ARG_NONE, &option_opp,
@@ -133,12 +209,12 @@ static GOptionEntry options[] = {
const char *obex_option_root_folder(void)
{
- return option_root;
+ return obexd_settings.root_folder;
}
gboolean obex_option_symlinks(void)
{
- return option_symlinks;
+ return obexd_settings.symlinks;
}
static gboolean is_dir(const char *dir) {
@@ -152,32 +228,33 @@ static gboolean is_dir(const char *dir) {
return S_ISDIR(st.st_mode);
}
-static gboolean root_folder_setup(char *root, char *root_setup)
+static gboolean root_folder_setup()
{
int status;
- char *argv[3] = { root_setup, root, NULL };
+ char *argv[3] = { obexd_settings.root_setup,
+ obexd_settings.root_folder, NULL };
- if (is_dir(root))
+ if (is_dir(argv[1]))
return TRUE;
- if (root_setup == NULL)
+ if (argv[0] == NULL || strlen(argv[0]) == 0)
return FALSE;
- DBG("Setting up %s using %s", root, root_setup);
+ DBG("Setting up %s using %s", argv[1], argv[0]);
if (!g_spawn_sync(NULL, argv, NULL, 0, NULL, NULL, NULL, NULL,
&status, NULL)) {
- error("Unable to execute %s", root_setup);
+ error("Unable to execute %s", argv[0]);
return FALSE;
}
if (WEXITSTATUS(status) != EXIT_SUCCESS) {
- error("%s exited with status %d", root_setup,
+ error("%s exited with status %d", argv[0],
WEXITSTATUS(status));
return FALSE;
}
- return is_dir(root);
+ return is_dir(argv[1]);
}
int main(int argc, char *argv[])
@@ -224,6 +301,9 @@ int main(int argc, char *argv[])
__obex_log_init("obexd", option_debug, option_detach);
+ if (option_config)
+ load_config(option_config);
+
DBG("Entering main loop");
main_loop = g_main_loop_new(NULL, FALSE);
@@ -240,43 +320,32 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
- if (option_root == NULL)
- option_root = g_strdup(DEFAULT_ROOT_PATH);
-
- if (option_root[0] != '/') {
- char *old_root = option_root, *home = getenv("HOME");
- if (home) {
- option_root = g_strdup_printf("%s/%s", home, old_root);
- g_free(old_root);
- }
- }
-
plugin_init();
- if (option_capability == NULL)
- option_capability = g_strdup(DEFAULT_CAP_FILE);
-
if (option_opp == TRUE)
- obex_server_init(OBEX_OPP, option_root, FALSE,
- option_autoaccept, option_symlinks,
- NULL);
+ obex_server_init(OBEX_OPP, obexd_settings.root_folder,
+ FALSE, option_autoaccept,
+ obexd_settings.symlinks,
+ NULL);
if (option_ftp == TRUE)
- obex_server_init(OBEX_FTP, option_root, TRUE,
- option_autoaccept, option_symlinks,
- option_capability);
+ obex_server_init(OBEX_FTP, obexd_settings.root_folder,
+ TRUE, option_autoaccept,
+ obexd_settings.symlinks,
+ obexd_settings.capability);
if (option_pbap == TRUE)
obex_server_init(OBEX_PBAP, NULL, TRUE, FALSE, FALSE, NULL);
if (option_pcsuite == TRUE)
- obex_server_init(OBEX_PCSUITE, option_root, TRUE,
- option_autoaccept, option_symlinks,
- option_capability);
+ obex_server_init(OBEX_PCSUITE, obexd_settings.root_folder,
+ TRUE, option_autoaccept,
+ obexd_settings.symlinks,
+ obexd_settings.capability);
if (option_irmc == TRUE)
obex_server_init(OBEX_IRMC, NULL, TRUE, FALSE, FALSE,
- option_capability);
+ obexd_settings.capability);
if (option_syncevolution == TRUE)
obex_server_init(OBEX_SYNCEVOLUTION, NULL, TRUE, FALSE,
@@ -285,8 +354,9 @@ int main(int argc, char *argv[])
if (option_mas == TRUE)
obex_server_init(OBEX_MAS, NULL, TRUE, FALSE, FALSE, NULL);
- if (!root_folder_setup(option_root, option_root_setup)) {
- error("Unable to setup root folder %s", option_root);
+ if (!root_folder_setup()) {
+ error("Unable to setup root folder %s",
+ obexd_settings.root_folder);
exit(EXIT_FAILURE);
}
@@ -308,9 +378,6 @@ int main(int argc, char *argv[])
g_main_loop_unref(main_loop);
- g_free(option_capability);
- g_free(option_root);
-
__obex_log_cleanup();
return 0;
--
1.7.5.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 2/2] Simplify options for including/excluding plugins
2011-05-24 16:12 [PATCH 1/2] Add conf file support Luiz Augusto von Dentz
@ 2011-05-24 16:12 ` Luiz Augusto von Dentz
2011-05-25 0:39 ` [PATCH 1/2] Add conf file support Marcel Holtmann
1 sibling, 0 replies; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2011-05-24 16:12 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.dentz-von@nokia.com>
Plugins options are now handle with --plugin(-p)/--noplugin(-P) which
takes a string set containing the plugin names separated by ',',':' or
' 'similar to bluetoothd, ofono and connman.
---
src/main.c | 76 ++++++++++++++-------------------------------------------
src/obexd.h | 2 +-
src/plugin.c | 51 +++++++++++++++++++++++++++++++++++++-
3 files changed, 69 insertions(+), 60 deletions(-)
diff --git a/src/main.c b/src/main.c
index 6e8ef8d..93cf352 100644
--- a/src/main.c
+++ b/src/main.c
@@ -146,15 +146,10 @@ static void sig_debug(int sig)
static gboolean option_detach = TRUE;
static char *option_debug = NULL;
static char *option_config = NULL;
+static char *option_plugin = NULL;
+static char *option_noplugin = NULL;
static gboolean option_autoaccept = FALSE;
-static gboolean option_opp = FALSE;
-static gboolean option_ftp = FALSE;
-static gboolean option_pbap = FALSE;
-static gboolean option_irmc = FALSE;
-static gboolean option_pcsuite = FALSE;
-static gboolean option_syncevolution = FALSE;
-static gboolean option_mas = FALSE;
static gboolean parse_debug(const char *key, const char *value,
gpointer user_data, GError **error)
@@ -190,20 +185,10 @@ static GOptionEntry options[] = {
"Config file location", "FILE" },
{ "auto-accept", 'a', 0, G_OPTION_ARG_NONE, &option_autoaccept,
"Automatically accept push requests" },
- { "opp", 'o', 0, G_OPTION_ARG_NONE, &option_opp,
- "Enable Object Push server" },
- { "ftp", 'f', 0, G_OPTION_ARG_NONE, &option_ftp,
- "Enable File Transfer server" },
- { "pbap", 'p', 0, G_OPTION_ARG_NONE, &option_pbap,
- "Enable Phonebook Access server" },
- { "irmc", 'i', 0, G_OPTION_ARG_NONE, &option_irmc,
- "Enable IrMC Sync server" },
- { "pcsuite", 's', 0, G_OPTION_ARG_NONE, &option_pcsuite,
- "Enable PC Suite Services server" },
- { "syncevolution", 'e', 0, G_OPTION_ARG_NONE, &option_syncevolution,
- "Enable OBEX server for SyncEvolution" },
- { "mas", 'm', 0, G_OPTION_ARG_NONE, &option_mas,
- "Enable Message Access server" },
+ { "plugin", 'p', 0, G_OPTION_ARG_STRING, &option_plugin,
+ "Specify plugins to load", "NAME,..." },
+ { "noplugin", 'P', 0, G_OPTION_ARG_STRING, &option_noplugin,
+ "Specify plugins not to load", "NAME,..." },
{ NULL },
};
@@ -289,16 +274,6 @@ int main(int argc, char *argv[])
}
}
- if (option_opp == FALSE && option_ftp == FALSE &&
- option_pbap == FALSE &&
- option_irmc == FALSE &&
- option_syncevolution == FALSE &&
- option_mas == FALSE) {
- fprintf(stderr, "No server selected (use either "
- "--opp, --ftp, --pbap, --irmc, --mas, or --syncevolution)\n");
- exit(EXIT_FAILURE);
- }
-
__obex_log_init("obexd", option_debug, option_detach);
if (option_config)
@@ -320,39 +295,26 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
- plugin_init();
+ plugin_init(option_plugin, option_noplugin);
- if (option_opp == TRUE)
- obex_server_init(OBEX_OPP, obexd_settings.root_folder,
- FALSE, option_autoaccept,
- obexd_settings.symlinks,
- NULL);
+ obex_server_init(OBEX_OPP, obexd_settings.root_folder, FALSE,
+ option_autoaccept, obexd_settings.symlinks, NULL);
- if (option_ftp == TRUE)
- obex_server_init(OBEX_FTP, obexd_settings.root_folder,
- TRUE, option_autoaccept,
- obexd_settings.symlinks,
- obexd_settings.capability);
+ obex_server_init(OBEX_FTP, obexd_settings.root_folder, TRUE,
+ option_autoaccept, obexd_settings.symlinks,
+ obexd_settings.capability);
- if (option_pbap == TRUE)
- obex_server_init(OBEX_PBAP, NULL, TRUE, FALSE, FALSE, NULL);
+ obex_server_init(OBEX_PCSUITE, obexd_settings.root_folder, TRUE,
+ option_autoaccept, obexd_settings.symlinks,
+ obexd_settings.capability);
- if (option_pcsuite == TRUE)
- obex_server_init(OBEX_PCSUITE, obexd_settings.root_folder,
- TRUE, option_autoaccept,
- obexd_settings.symlinks,
- obexd_settings.capability);
+ obex_server_init(OBEX_PBAP, NULL, TRUE, FALSE, FALSE, NULL);
- if (option_irmc == TRUE)
- obex_server_init(OBEX_IRMC, NULL, TRUE, FALSE, FALSE,
- obexd_settings.capability);
+ obex_server_init(OBEX_IRMC, NULL, TRUE, FALSE, FALSE, NULL);
- if (option_syncevolution == TRUE)
- obex_server_init(OBEX_SYNCEVOLUTION, NULL, TRUE, FALSE,
- FALSE, NULL);
+ obex_server_init(OBEX_SYNCEVOLUTION, NULL, TRUE, FALSE, FALSE, NULL);
- if (option_mas == TRUE)
- obex_server_init(OBEX_MAS, NULL, TRUE, FALSE, FALSE, NULL);
+ obex_server_init(OBEX_MAS, NULL, TRUE, FALSE, FALSE, NULL);
if (!root_folder_setup()) {
error("Unable to setup root folder %s",
diff --git a/src/obexd.h b/src/obexd.h
index df21f00..37106b7 100644
--- a/src/obexd.h
+++ b/src/obexd.h
@@ -21,7 +21,7 @@
*
*/
-gboolean plugin_init(void);
+gboolean plugin_init(const char *pattern, const char *exclude);
void plugin_cleanup(void);
gboolean manager_init(void);
diff --git a/src/plugin.c b/src/plugin.c
index 14a569f..c8ec642 100644
--- a/src/plugin.c
+++ b/src/plugin.c
@@ -79,10 +79,39 @@ static gboolean add_plugin(void *handle, struct obex_plugin_desc *desc)
return TRUE;
}
+static gboolean check_plugin(struct obex_plugin_desc *desc,
+ char **patterns, char **excludes)
+{
+ if (excludes) {
+ for (; *excludes; excludes++)
+ if (g_pattern_match_simple(*excludes, desc->name))
+ break;
+ if (*excludes) {
+ info("Excluding %s", desc->name);
+ return FALSE;
+ }
+ }
+
+ if (patterns) {
+ for (; *patterns; patterns++)
+ if (g_pattern_match_simple(*patterns, desc->name))
+ break;
+ if (*patterns == NULL) {
+ info("Ignoring %s", desc->name);
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+
#include "builtin.h"
-gboolean plugin_init(void)
+gboolean plugin_init(const char *pattern, const char *exclude)
{
+ gchar **patterns = NULL;
+ gchar **excludes = NULL;
GDir *dir;
const char *file;
unsigned int i;
@@ -90,10 +119,21 @@ gboolean plugin_init(void)
if (strlen(PLUGINDIR) == 0)
return FALSE;
+ if (pattern)
+ patterns = g_strsplit_set(pattern, ":, ", -1);
+
+ if (exclude)
+ excludes = g_strsplit_set(exclude, ":, ", -1);
+
DBG("Loading builtin plugins");
- for (i = 0; __obex_builtin[i]; i++)
+ for (i = 0; __obex_builtin[i]; i++) {
+ if (check_plugin(__obex_builtin[i],
+ patterns, excludes) == FALSE)
+ continue;
+
add_plugin(NULL, __obex_builtin[i]);
+ }
DBG("Loading plugins %s", PLUGINDIR);
@@ -129,11 +169,18 @@ gboolean plugin_init(void)
continue;
}
+ if (check_plugin(desc, patterns, excludes) == FALSE) {
+ dlclose(handle);
+ continue;
+ }
+
if (add_plugin(handle, desc) == FALSE)
dlclose(handle);
}
g_dir_close(dir);
+ g_strfreev(patterns);
+ g_strfreev(excludes);
return TRUE;
}
--
1.7.5.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 1/2] Add conf file support
2011-05-24 16:12 [PATCH 1/2] Add conf file support Luiz Augusto von Dentz
2011-05-24 16:12 ` [PATCH 2/2] Simplify options for including/excluding plugins Luiz Augusto von Dentz
@ 2011-05-25 0:39 ` Marcel Holtmann
2011-05-25 6:14 ` Luiz Augusto von Dentz
1 sibling, 1 reply; 10+ messages in thread
From: Marcel Holtmann @ 2011-05-25 0:39 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
Hi Luiz,
> This should reduce the amount of options which normally don't change
> each time obexd is executed.
> ---
> Makefile.am | 2 +-
> plugins/ftp.c | 8 ++-
> src/main.c | 173 +++++++++++++++++++++++++++++++++++++++-----------------
> 3 files changed, 127 insertions(+), 56 deletions(-)
I do not want to have config file support for obexd.
Regards
Marcel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] Add conf file support
2011-05-25 0:39 ` [PATCH 1/2] Add conf file support Marcel Holtmann
@ 2011-05-25 6:14 ` Luiz Augusto von Dentz
2011-05-25 19:48 ` Marcel Holtmann
0 siblings, 1 reply; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2011-05-25 6:14 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: linux-bluetooth
Hi Marcel,
On Wed, May 25, 2011 at 3:39 AM, Marcel Holtmann <marcel@holtmann.org> wrot=
e:
> Hi Luiz,
>
>> This should reduce the amount of options which normally don't change
>> each time obexd is executed.
>> ---
>> =A0Makefile.am =A0 | =A0 =A02 +-
>> =A0plugins/ftp.c | =A0 =A08 ++-
>> =A0src/main.c =A0 =A0| =A0173 +++++++++++++++++++++++++++++++++++++++---=
--------------
>> =A03 files changed, 127 insertions(+), 56 deletions(-)
>
> I do not want to have config file support for obexd.
>
Alright, then I will just update the documentation of the current
options to be more detailed and remove the old configuration file that
still exists on the repository.
--=20
Luiz Augusto von Dentz
Computer Engineer
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] Add conf file support
2011-05-25 6:14 ` Luiz Augusto von Dentz
@ 2011-05-25 19:48 ` Marcel Holtmann
2011-05-25 19:58 ` Luiz Augusto von Dentz
0 siblings, 1 reply; 10+ messages in thread
From: Marcel Holtmann @ 2011-05-25 19:48 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
Hi Luiz,
> >> This should reduce the amount of options which normally don't change
> >> each time obexd is executed.
> >> ---
> >> Makefile.am | 2 +-
> >> plugins/ftp.c | 8 ++-
> >> src/main.c | 173 +++++++++++++++++++++++++++++++++++++++-----------------
> >> 3 files changed, 127 insertions(+), 56 deletions(-)
> >
> > I do not want to have config file support for obexd.
> >
>
> Alright, then I will just update the documentation of the current
> options to be more detailed and remove the old configuration file that
> still exists on the repository.
I don't know how much Johan mentioned on IRC, but what we should be
doing is by default enable all compiled in plugins and then use -p and
-P command line switches to control what gets enabled and what not. And
that can be done easily in the D-Bus autostart file.
Regards
Marcel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] Add conf file support
2011-05-25 19:48 ` Marcel Holtmann
@ 2011-05-25 19:58 ` Luiz Augusto von Dentz
0 siblings, 0 replies; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2011-05-25 19:58 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: linux-bluetooth
Hi Marcel,
On Wed, May 25, 2011 at 10:48 PM, Marcel Holtmann <marcel@holtmann.org> wro=
te:
> Hi Luiz,
>
>> >> This should reduce the amount of options which normally don't change
>> >> each time obexd is executed.
>> >> ---
>> >> =A0Makefile.am =A0 | =A0 =A02 +-
>> >> =A0plugins/ftp.c | =A0 =A08 ++-
>> >> =A0src/main.c =A0 =A0| =A0173 +++++++++++++++++++++++++++++++++++++++=
-----------------
>> >> =A03 files changed, 127 insertions(+), 56 deletions(-)
>> >
>> > I do not want to have config file support for obexd.
>> >
>>
>> Alright, then I will just update the documentation of the current
>> options to be more detailed and remove the old configuration file that
>> still exists on the repository.
>
> I don't know how much Johan mentioned on IRC, but what we should be
> doing is by default enable all compiled in plugins and then use -p and
> -P command line switches to control what gets enabled and what not. And
> that can be done easily in the D-Bus autostart file.
That one I did in a separated patch, 1/3 in the new series I just have
sent today, it should work just like connman, ofono and BlueZ do.
--=20
Luiz Augusto von Dentz
Computer Engineer
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] Add conf file support
@ 2011-05-17 8:17 Luiz Augusto von Dentz
2011-05-20 18:04 ` Johan Hedberg
0 siblings, 1 reply; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2011-05-17 8:17 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.dentz-von@nokia.com>
This should reduce the amount of options which normally don't change each
time obexd is executed.
---
Makefile.am | 2 +-
plugins/ftp.c | 8 ++-
src/main.c | 176 +++++++++++++++++++++++++++++++++++++++-----------------
src/obexd.conf | 19 ++++++
4 files changed, 149 insertions(+), 56 deletions(-)
create mode 100644 src/obexd.conf
diff --git a/Makefile.am b/Makefile.am
index 8d8fdc6..2b329a6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -138,7 +138,7 @@ INCLUDES = -I$(builddir)/src -I$(srcdir)/src -I$(srcdir)/plugins \
CLEANFILES = $(service_DATA) $(builtin_files)
-EXTRA_DIST = src/genbuiltin $(doc_files) $(test_files) src/obex.conf \
+EXTRA_DIST = src/genbuiltin $(doc_files) $(test_files) src/obexd.conf \
src/obexd.service.in client/obex-client.service.in \
plugins/phonebook-dummy.c plugins/phonebook-ebook.c \
plugins/phonebook-tracker.c \
diff --git a/plugins/ftp.c b/plugins/ftp.c
index 79223bf..879d9e9 100644
--- a/plugins/ftp.c
+++ b/plugins/ftp.c
@@ -179,8 +179,12 @@ static int get_by_type(struct ftp_session *ftp, const char *type)
if (type == NULL && name == NULL)
return -EBADR;
- if (g_strcmp0(type, CAP_TYPE) == 0)
- return obex_get_stream_start(os, capability);
+ if (g_strcmp0(type, CAP_TYPE) == 0) {
+ if (capability)
+ return obex_get_stream_start(os, capability);
+ else
+ return -ENOENT;
+ }
path = g_build_filename(ftp->folder, name, NULL);
err = obex_get_stream_start(os, path);
diff --git a/src/main.c b/src/main.c
index 8154e3b..018a8cf 100644
--- a/src/main.c
+++ b/src/main.c
@@ -54,7 +54,83 @@
#define DEFAULT_ROOT_PATH "/tmp"
-#define DEFAULT_CAP_FILE CONFIGDIR "/capability.xml"
+static struct {
+ char *root_setup;
+ char *root_folder;
+ char *capability;
+ gboolean symlinks;
+} obexd_settings = {
+ .root_setup = NULL,
+ .root_folder = DEFAULT_ROOT_PATH,
+ .capability = NULL,
+ .symlinks = FALSE
+};
+
+static void parse_config(GKeyFile *config)
+{
+ GError *error = NULL;
+ char *string;
+ gboolean boolean;
+
+ string = g_key_file_get_string(config, "General",
+ "RootSetup", &error);
+ if (error == NULL)
+ obexd_settings.root_setup = string;
+ else
+ g_clear_error(&error);
+
+ string = g_key_file_get_string(config, "General",
+ "RootFolder", &error);
+ if (error == NULL) {
+ if (string[0] != '/') {
+ char *old_root = string, *home = getenv("HOME");
+ if (home) {
+ string = g_strdup_printf("%s/%s", home, old_root);
+ g_free(old_root);
+ }
+ }
+
+ obexd_settings.root_folder = string;
+ } else
+ g_clear_error(&error);
+
+ string = g_key_file_get_string(config, "General",
+ "Capability", &error);
+ if (error == NULL)
+ obexd_settings.capability = string;
+ else
+ g_clear_error(&error);
+
+ boolean = g_key_file_get_boolean(config, "General",
+ "Symlinks", &error);
+ if (error == NULL)
+ obexd_settings.symlinks = boolean;
+
+ g_clear_error(&error);
+}
+
+static GKeyFile *load_config(const char *file)
+{
+ GError *err = NULL;
+ GKeyFile *keyfile;
+
+ DBG("%s", file);
+
+ keyfile = g_key_file_new();
+
+ g_key_file_set_list_separator(keyfile, ',');
+
+ if (!g_key_file_load_from_file(keyfile, file, 0, &err)) {
+ error("Parsing %s failed: %s", file, err->message);
+ g_error_free(err);
+ g_key_file_free(keyfile);
+ return NULL;
+ }
+
+ parse_config(keyfile);
+
+ return keyfile;
+}
static GMainLoop *main_loop = NULL;
@@ -71,10 +147,7 @@ static void sig_debug(int sig)
static gboolean option_detach = TRUE;
static char *option_debug = NULL;
-
-static char *option_root = NULL;
-static char *option_root_setup = NULL;
-static char *option_capability = NULL;
+static char *option_config = NULL;
static gboolean option_autoaccept = FALSE;
static gboolean option_opp = FALSE;
@@ -82,7 +155,6 @@ static gboolean option_ftp = FALSE;
static gboolean option_pbap = FALSE;
static gboolean option_irmc = FALSE;
static gboolean option_pcsuite = FALSE;
-static gboolean option_symlinks = FALSE;
static gboolean option_syncevolution = FALSE;
static gboolean option_mas = FALSE;
@@ -97,6 +169,17 @@ static gboolean parse_debug(const char *key, const char *value,
return TRUE;
}
+static gboolean set_config(const char *key, const char *value,
+ gpointer user_data, GError **error)
+{
+ if (!value)
+ return FALSE;
+
+ option_config = g_strdup(value);
+
+ return TRUE;
+}
+
static GOptionEntry options[] = {
{ "nodaemon", 'n', G_OPTION_FLAG_REVERSE,
G_OPTION_ARG_NONE, &option_detach,
@@ -104,14 +187,9 @@ static GOptionEntry options[] = {
{ "debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
G_OPTION_ARG_CALLBACK, parse_debug,
"Enable debug information output", "DEBUG" },
- { "root", 'r', 0, G_OPTION_ARG_STRING, &option_root,
- "Specify root folder location", "PATH" },
- { "root-setup", 'S', 0, G_OPTION_ARG_STRING, &option_root_setup,
- "Root folder setup script", "SCRIPT" },
- { "symlinks", 'l', 0, G_OPTION_ARG_NONE, &option_symlinks,
- "Enable symlinks on root folder" },
- { "capability", 'c', 0, G_OPTION_ARG_STRING, &option_capability,
- "Specify capability file", "FILE" },
+ { "config", 'c', G_OPTION_FLAG_OPTIONAL_ARG,
+ G_OPTION_ARG_CALLBACK, set_config,
+ "Config file location", "FILE" },
{ "auto-accept", 'a', 0, G_OPTION_ARG_NONE, &option_autoaccept,
"Automatically accept push requests" },
{ "opp", 'o', 0, G_OPTION_ARG_NONE, &option_opp,
@@ -133,12 +211,12 @@ static GOptionEntry options[] = {
const char *obex_option_root_folder(void)
{
- return option_root;
+ return obexd_settings.root_folder;
}
gboolean obex_option_symlinks(void)
{
- return option_symlinks;
+ return obexd_settings.symlinks;
}
static gboolean is_dir(const char *dir) {
@@ -152,32 +230,33 @@ static gboolean is_dir(const char *dir) {
return S_ISDIR(st.st_mode);
}
-static gboolean root_folder_setup(char *root, char *root_setup)
+static gboolean root_folder_setup()
{
int status;
- char *argv[3] = { root_setup, root, NULL };
+ char *argv[3] = { obexd_settings.root_setup,
+ obexd_settings.root_folder, NULL };
- if (is_dir(root))
+ if (is_dir(argv[1]))
return TRUE;
- if (root_setup == NULL)
+ if (argv[0] == NULL || strlen(argv[0]) == 0)
return FALSE;
- DBG("Setting up %s using %s", root, root_setup);
+ DBG("Setting up %s using %s", argv[1], argv[0]);
if (!g_spawn_sync(NULL, argv, NULL, 0, NULL, NULL, NULL, NULL,
&status, NULL)) {
- error("Unable to execute %s", root_setup);
+ error("Unable to execute %s", argv[0]);
return FALSE;
}
if (WEXITSTATUS(status) != EXIT_SUCCESS) {
- error("%s exited with status %d", root_setup,
+ error("%s exited with status %d", argv[0],
WEXITSTATUS(status));
return FALSE;
}
- return is_dir(root);
+ return is_dir(argv[1]);
}
int main(int argc, char *argv[])
@@ -185,6 +264,7 @@ int main(int argc, char *argv[])
GOptionContext *context;
GError *err = NULL;
struct sigaction sa;
+ GKeyFile *config;
#ifdef NEED_THREADS
if (g_thread_supported() == FALSE)
@@ -224,6 +304,9 @@ int main(int argc, char *argv[])
__obex_log_init("obexd", option_debug, option_detach);
+ if (option_config)
+ config = load_config(option_config);
+
DBG("Entering main loop");
main_loop = g_main_loop_new(NULL, FALSE);
@@ -240,43 +323,32 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
- if (option_root == NULL)
- option_root = g_strdup(DEFAULT_ROOT_PATH);
-
- if (option_root[0] != '/') {
- char *old_root = option_root, *home = getenv("HOME");
- if (home) {
- option_root = g_strdup_printf("%s/%s", home, old_root);
- g_free(old_root);
- }
- }
-
plugin_init();
- if (option_capability == NULL)
- option_capability = g_strdup(DEFAULT_CAP_FILE);
-
if (option_opp == TRUE)
- obex_server_init(OBEX_OPP, option_root, FALSE,
- option_autoaccept, option_symlinks,
- NULL);
+ obex_server_init(OBEX_OPP, obexd_settings.root_folder,
+ FALSE, option_autoaccept,
+ obexd_settings.symlinks,
+ NULL);
if (option_ftp == TRUE)
- obex_server_init(OBEX_FTP, option_root, TRUE,
- option_autoaccept, option_symlinks,
- option_capability);
+ obex_server_init(OBEX_FTP, obexd_settings.root_folder,
+ TRUE, option_autoaccept,
+ obexd_settings.symlinks,
+ obexd_settings.capability);
if (option_pbap == TRUE)
obex_server_init(OBEX_PBAP, NULL, TRUE, FALSE, FALSE, NULL);
if (option_pcsuite == TRUE)
- obex_server_init(OBEX_PCSUITE, option_root, TRUE,
- option_autoaccept, option_symlinks,
- option_capability);
+ obex_server_init(OBEX_PCSUITE, obexd_settings.root_folder,
+ TRUE, option_autoaccept,
+ obexd_settings.symlinks,
+ obexd_settings.capability);
if (option_irmc == TRUE)
obex_server_init(OBEX_IRMC, NULL, TRUE, FALSE, FALSE,
- option_capability);
+ obexd_settings.capability);
if (option_syncevolution == TRUE)
obex_server_init(OBEX_SYNCEVOLUTION, NULL, TRUE, FALSE,
@@ -285,8 +357,9 @@ int main(int argc, char *argv[])
if (option_mas == TRUE)
obex_server_init(OBEX_MAS, NULL, TRUE, FALSE, FALSE, NULL);
- if (!root_folder_setup(option_root, option_root_setup)) {
- error("Unable to setup root folder %s", option_root);
+ if (!root_folder_setup()) {
+ error("Unable to setup root folder %s",
+ obexd_settings.root_folder);
exit(EXIT_FAILURE);
}
@@ -308,9 +381,6 @@ int main(int argc, char *argv[])
g_main_loop_unref(main_loop);
- g_free(option_capability);
- g_free(option_root);
-
__obex_log_cleanup();
return 0;
diff --git a/src/obexd.conf b/src/obexd.conf
new file mode 100644
index 0000000..ef2541b
--- /dev/null
+++ b/src/obexd.conf
@@ -0,0 +1,19 @@
+[General]
+
+# Root folder location. Both absolute and relative paths can be used, but
+# relative paths are assumed to be relative to user $HOME folder
+# Default /tmp
+RootFolder = /tmp
+
+# Root setup script absolute path used in case root folder doesn't exist
+# Default none
+#RootSetup =
+
+# Capability file or script absolute path, in case of script it should start
+# with '!' mark.
+# Default none
+#Capability =
+
+# Indicates if symbolics links should be followed (only on root folder)
+# Default false
+Symlinks = false
--
1.7.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 1/2] Add conf file support
2011-05-17 8:17 Luiz Augusto von Dentz
@ 2011-05-20 18:04 ` Johan Hedberg
2011-05-20 18:37 ` Marcel Holtmann
0 siblings, 1 reply; 10+ messages in thread
From: Johan Hedberg @ 2011-05-20 18:04 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
Hi Luiz,
On Tue, May 17, 2011, Luiz Augusto von Dentz wrote:
> This should reduce the amount of options which normally don't change each
> time obexd is executed.
> ---
> Makefile.am | 2 +-
> plugins/ftp.c | 8 ++-
> src/main.c | 176 +++++++++++++++++++++++++++++++++++++++-----------------
> src/obexd.conf | 19 ++++++
> 4 files changed, 149 insertions(+), 56 deletions(-)
> create mode 100644 src/obexd.conf
This doesn't compile with gcc 4.6:
src/main.c: In function ‘main’:
src/main.c:267:12: error: variable ‘config’ set but not used [-Werror=unused-but-set-variable]
Please fix and resend.
Johan
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] Add conf file support
2011-05-20 18:04 ` Johan Hedberg
@ 2011-05-20 18:37 ` Marcel Holtmann
2011-05-20 19:17 ` Luiz Augusto von Dentz
0 siblings, 1 reply; 10+ messages in thread
From: Marcel Holtmann @ 2011-05-20 18:37 UTC (permalink / raw)
To: Johan Hedberg; +Cc: Luiz Augusto von Dentz, linux-bluetooth
Hi Johan,
> > This should reduce the amount of options which normally don't change each
> > time obexd is executed.
> > ---
> > Makefile.am | 2 +-
> > plugins/ftp.c | 8 ++-
> > src/main.c | 176 +++++++++++++++++++++++++++++++++++++++-----------------
> > src/obexd.conf | 19 ++++++
> > 4 files changed, 149 insertions(+), 56 deletions(-)
> > create mode 100644 src/obexd.conf
>
> This doesn't compile with gcc 4.6:
>
> src/main.c: In function ‘main’:
> src/main.c:267:12: error: variable ‘config’ set but not used [-Werror=unused-but-set-variable]
>
> Please fix and resend.
didn't we agree on not having an obexd configuration file. That stuff
should be part of the D-Bus service autostart file.
Regards
Marcel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] Add conf file support
2011-05-20 18:37 ` Marcel Holtmann
@ 2011-05-20 19:17 ` Luiz Augusto von Dentz
0 siblings, 0 replies; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2011-05-20 19:17 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: Johan Hedberg, linux-bluetooth
Hi Johan, Marcel,
On Fri, May 20, 2011 at 9:37 PM, Marcel Holtmann <marcel@holtmann.org> wrot=
e:
> Hi Johan,
>
>> > This should reduce the amount of options which normally don't change e=
ach
>> > time obexd is executed.
>> > ---
>> > =A0Makefile.am =A0 =A0| =A0 =A02 +-
>> > =A0plugins/ftp.c =A0| =A0 =A08 ++-
>> > =A0src/main.c =A0 =A0 | =A0176 +++++++++++++++++++++++++++++++++++++++=
-----------------
>> > =A0src/obexd.conf | =A0 19 ++++++
>> > =A04 files changed, 149 insertions(+), 56 deletions(-)
>> > =A0create mode 100644 src/obexd.conf
>>
>> This doesn't compile with gcc 4.6:
>>
>> src/main.c: In function =91main=92:
>> src/main.c:267:12: error: variable =91config=92 set but not used [-Werro=
r=3Dunused-but-set-variable]
>>
>> Please fix and resend.
Gonna fix that,
> didn't we agree on not having an obexd configuration file. That stuff
> should be part of the D-Bus service autostart file.
Well you still have to specify the configuration location on service
file, so it not like bluetoothd which always loads from a specific
location. Besides the point here is to group together configurations
that a normal user should be able to customize, so the configuration
could be on user home e.g. /home/user/.obexd.conf.
--=20
Luiz Augusto von Dentz
Computer Engineer
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2011-05-25 19:58 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-24 16:12 [PATCH 1/2] Add conf file support Luiz Augusto von Dentz
2011-05-24 16:12 ` [PATCH 2/2] Simplify options for including/excluding plugins Luiz Augusto von Dentz
2011-05-25 0:39 ` [PATCH 1/2] Add conf file support Marcel Holtmann
2011-05-25 6:14 ` Luiz Augusto von Dentz
2011-05-25 19:48 ` Marcel Holtmann
2011-05-25 19:58 ` Luiz Augusto von Dentz
-- strict thread matches above, loose matches on Subject: below --
2011-05-17 8:17 Luiz Augusto von Dentz
2011-05-20 18:04 ` Johan Hedberg
2011-05-20 18:37 ` Marcel Holtmann
2011-05-20 19:17 ` Luiz Augusto von Dentz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox