diff --git a/obexd/src/bluetooth.c b/obexd/src/bluetooth.c
index bc7836a..8f3b40e 100644
--- a/obexd/src/bluetooth.c
+++ b/obexd/src/bluetooth.c
}
static gint server_register(guint16 service, const gchar *name, guint8 channel,
- const gchar *folder, gboolean secure, gboolean auto_accept)
+ const gchar *folder, gboolean secure,
+ gboolean auto_accept, const gchar *capability)
{
struct sockaddr_rc laddr;
GIOChannel *io;
server->service = service;
server->folder = g_strdup(folder);
server->auto_accept = auto_accept;
+ server->capability = g_strdup(capability);
io = g_io_channel_unix_new(sk);
g_io_channel_set_close_on_unref(io, TRUE);
}
gint bluetooth_init(guint service, const gchar *name, const gchar *folder,
- guint8 channel, gboolean secure, gboolean auto_accept)
+ guint8 channel, gboolean secure, gboolean auto_accept,
+ const gchar *capability)
{
if (!session) {
session = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY);
}
return server_register(service, name, channel,
- folder, secure, auto_accept);
+ folder, secure, auto_accept, capability);
}
static void unregister_record(gpointer rec_handle, gpointer user_data)
diff --git a/obexd/src/bluetooth.h b/obexd/src/bluetooth.h
index dec0b14..bc50c19 100644
--- a/obexd/src/bluetooth.h
+++ b/obexd/src/bluetooth.h
#endif
gint bluetooth_init(guint service, const gchar *name, const gchar *folder,
- guint8 channel, gboolean secure, gboolean auto_accept);
+ guint8 channel, gboolean secure, gboolean auto_accept,
+ const gchar *capability);
void bluetooth_exit(void);
diff --git a/obexd/src/ftp.c b/obexd/src/ftp.c
index e27954d..969c288 100644
--- a/obexd/src/ftp.c
+++ b/obexd/src/ftp.c
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#define LST_TYPE "x-obex/folder-listing"
#define CAP_TYPE "x-obex/capability"
-#define CAP_FILE CONFIGDIR "/capability.xml"
-
#define EOL_CHARS "\n"
#define FL_VERSION "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" EOL_CHARS
return TRUE;
}
+static gboolean get_capability(struct obex_session *os, guint32 *size)
+{
+ GError *gerr = NULL;
+ gchar *buf;
+ gint exit;
+ gboolean ret;
+
+ debug("%s - cap: %s", __func__, os->server->capability);
+
+ if (os->server->capability[0] != '!') {
+ return os_prepare_get(os, os->server->capability, size);
+ }
+
+ ret = g_spawn_command_line_sync(os->server->capability + 1,
+ &buf, NULL, &exit, &gerr);
+ if (ret == FALSE) {
+ error("g_spawn_command_line_sync: %s", gerr->message);
+ g_error_free(gerr);
+ return FALSE;
+ }
+
+ if (WEXITSTATUS(exit) != EXIT_SUCCESS) {
+ g_free(buf);
+ return FALSE;
+ }
+
+ os->buf = (guint8 *) buf;
+ *size = strlen(buf);
+
+ return TRUE;
+}
+
static gboolean get_by_type(struct obex_session *os, gchar *type, guint32 *size)
{
if (type == NULL)
return FALSE;
if (g_str_equal(type, CAP_TYPE))
- return os_prepare_get(os, CAP_FILE, size);
+ return get_capability(os, size);
if (g_str_equal(type, LST_TYPE))
return folder_listing(os, size);
diff --git a/obexd/src/main.c b/obexd/src/main.c
index 5bfd84f..17bf2f6 100644
--- a/obexd/src/main.c
+++ b/obexd/src/main.c
#define DEFAULT_ROOT_PATH "/tmp"
+#define DEFAULT_CAP_FILE CONFIGDIR "/capability.xml"
+
static GMainLoop *main_loop = NULL;
static int server_start(int service, const char *root_path,
- gboolean auto_accept)
+ gboolean auto_accept, const gchar *capability)
{
/* FIXME: Necessary check enabled transports(Bluetooth/USB) */
switch (service) {
case OBEX_OPUSH:
bluetooth_init(OBEX_OPUSH, "OBEX OPUSH server",
- root_path, OPUSH_CHANNEL, FALSE, auto_accept);
+ root_path, OPUSH_CHANNEL, FALSE,
+ auto_accept, capability);
break;
case OBEX_FTP:
bluetooth_init(OBEX_FTP, "OBEX FTP server",
- root_path, FTP_CHANNEL, TRUE, auto_accept);
+ root_path, FTP_CHANNEL, TRUE,
+ auto_accept, capability);
break;
default:
return -EINVAL;
"\n");
printf("Options:\n"
- "\t-n, --nodaemon Don't fork daemon to background\n"
- "\t-d, --debug Enable output of debug information\n"
- "\t-r, --root <path> Specify root folder location\n"
- "\t-a, --auto-accept Automatically accept push requests\n"
- "\t-h, --help Display help\n");
+ "\t-n, --nodaemon Don't fork daemon to background\n"
+ "\t-d, --debug Enable output of debug information\n"
+ "\t-r, --root <path> Specify root folder location\n"
+ "\t-c, --capability <file> Specify the capability file.\n"
+ "\t-a, --auto-accept Automatically accept push requests\n"
+ "\t-h, --help Display help\n");
printf("Servers:\n"
- "\t-o, --opp Enable OPP server\n"
- "\t-f, --ftp Enable FTP server\n"
+ "\t-o, --opp Enable OPP server\n"
+ "\t-f, --ftp Enable FTP server\n"
"\n");
}
static struct option options[] = {
- { "nodaemon", 0, 0, 'n' },
- { "debug", 0, 0, 'd' },
- { "ftp", 0, 0, 'f' },
- { "opp", 0, 0, 'o' },
- { "help", 0, 0, 'h' },
- { "root", 1, 0, 'r' },
+ { "nodaemon", 0, 0, 'n' },
+ { "debug", 0, 0, 'd' },
+ { "ftp", 0, 0, 'f' },
+ { "opp", 0, 0, 'o' },
+ { "help", 0, 0, 'h' },
+ { "root", 1, 0, 'r' },
+ { "capability", 1, 0, 'c' },
{ "auto-accept", 0, 0, 'a' },
{ }
};
int log_option = LOG_NDELAY | LOG_PID;
int opt, detach = 1, debug = 0, opush = 0, ftp = 0, auto_accept = 0;
const char *root_path = DEFAULT_ROOT_PATH;
+ const char *capability = DEFAULT_CAP_FILE;
- while ((opt = getopt_long(argc, argv, "+ndhofr:a", options, NULL)) != EOF) {
+ while ((opt = getopt_long(argc, argv, "+ndhofr:c:a", options, NULL)) != EOF) {
switch(opt) {
case 'n':
detach = 0;
case 'r':
root_path = optarg;
break;
+ case 'c':
+ capability = optarg;
case 'a':
auto_accept = 1;
break;
}
if (opush)
- server_start(OBEX_OPUSH, root_path, auto_accept);
+ server_start(OBEX_OPUSH, root_path, auto_accept, capability);
if (ftp)
- server_start(OBEX_FTP, root_path, auto_accept);
+ server_start(OBEX_FTP, root_path, auto_accept, capability);
if (!manager_init(conn))
goto fail;
diff --git a/obexd/src/obex.h b/obexd/src/obex.h
index 132ae1b..006d314 100644
--- a/obexd/src/obex.h
+++ b/obexd/src/obex.h
guint16 service;
gboolean auto_accept;
gchar *folder;
+ gchar *capability;
};
struct obex_session {