diff --git a/obexd/src/main.c b/obexd/src/main.c
index 96f78ea..3f5aaea 100644
--- a/obexd/src/main.c
+++ b/obexd/src/main.c
#include <stdlib.h>
#include <string.h>
#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <termios.h>
#include <getopt.h>
#include <syslog.h>
#include <glib.h>
static GMainLoop *main_loop = NULL;
-static int server_start(int service, const char *root_path,
- gboolean auto_accept, const gchar *capability)
+static void tty_init(int service, const gchar *root_path, const gchar *capability,
+ const gchar *devnode)
{
- /* FIXME: Necessary check enabled transports(Bluetooth/USB) */
+ struct server *server;
+ struct termios options;
+ gint fd;
+
+ fd = open(devnode, O_RDWR);
+ if (fd < 0)
+ return;
+
+ fcntl(fd, F_SETFL, 0);
+
+ tcgetattr(fd, &options);
+
+ options.c_cflag |= (CLOCAL | CREAD);
+ options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
+ options.c_oflag &= ~OPOST;
+ options.c_cc[VMIN] = 0;
+ options.c_cc[VTIME] = 10;
+
+ tcsetattr(fd, TCSANOW, &options);
+
+ server = g_malloc0(sizeof(struct server));
+ server->service = service;
+ server->folder = g_strdup(root_path);
+ server->auto_accept = TRUE;
+ server->capability = g_strdup(capability);
+
+ if (obex_session_start(fd, server) < 0)
+ close(fd);
+
+ return;
+}
+static int server_start(int service, const char *root_path,
+ gboolean auto_accept, const gchar *capability,
+ const char *devnode, int bluetooth)
+{
switch (service) {
case OBEX_OPUSH:
- bluetooth_init(OBEX_OPUSH, "OBEX OPUSH server",
- root_path, OPUSH_CHANNEL, FALSE,
- auto_accept, capability);
+ if (bluetooth)
+ bluetooth_init(OBEX_OPUSH, "OBEX OPUSH server",
+ root_path, OPUSH_CHANNEL, FALSE,
+ auto_accept, capability);
+ if (devnode)
+ tty_init(OBEX_OPUSH, root_path, capability,
+ devnode);
break;
case OBEX_FTP:
- bluetooth_init(OBEX_FTP, "OBEX FTP server",
- root_path, FTP_CHANNEL, TRUE,
- auto_accept, capability);
+ if (bluetooth)
+ bluetooth_init(OBEX_FTP, "OBEX FTP server",
+ root_path, FTP_CHANNEL, TRUE,
+ auto_accept, capability);
+
+ if (devnode)
+ tty_init(OBEX_FTP, root_path, capability, devnode);
break;
default:
return -EINVAL;
"\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-t, --tty <devnode> Specify the TTY device\n"
+ "\t-b, --bluetooth Enable bluetooth support\n"
"\t-a, --auto-accept Automatically accept push requests\n"
"\t-h, --help Display help\n");
printf("Servers:\n"
{ "help", 0, 0, 'h' },
{ "root", 1, 0, 'r' },
{ "capability", 1, 0, 'c' },
+ { "tty", 1, 0, 't' },
+ { "bluetooth", 0, 0, 'b' },
{ "auto-accept", 0, 0, 'a' },
{ }
};
struct sigaction sa;
int log_option = LOG_NDELAY | LOG_PID;
int opt, detach = 1, debug = 0, opush = 0, ftp = 0, auto_accept = 0;
+ int bluetooth = 0;
const char *root_path = DEFAULT_ROOT_PATH;
const char *capability = DEFAULT_CAP_FILE;
+ const char *devnode = NULL;
- while ((opt = getopt_long(argc, argv, "+ndhofr:c:a", options, NULL)) != EOF) {
+ while ((opt = getopt_long(argc, argv, "+ndhofr:c:t:ab", options, NULL)) != EOF) {
switch(opt) {
case 'n':
detach = 0;
case 'c':
capability = optarg;
break;
+ case 't':
+ devnode = optarg;
+ break;
+ case 'b':
+ bluetooth = 1;
+ break;
case 'a':
auto_accept = 1;
break;
exit(EXIT_FAILURE);
}
+ if (!(bluetooth || devnode)) {
+ fprintf(stderr, "No transport selected (use either "
+ "--bluetooth or --tty or both)\n");
+ exit(EXIT_FAILURE);
+ }
+
if (detach) {
if (daemon(0, 0)) {
perror("Can't start daemon");
}
if (opush)
- server_start(OBEX_OPUSH, root_path, auto_accept, NULL);
+ server_start(OBEX_OPUSH, root_path, auto_accept,
+ NULL, devnode, bluetooth);
if (ftp)
- server_start(OBEX_FTP, root_path, auto_accept, capability);
+ server_start(OBEX_FTP, root_path, auto_accept,
+ capability, devnode, bluetooth);
if (!manager_init(conn)) {
error("manager_init failed");