From a45ba4ef2cebc454c7d1218fd01c75f550807bfd Mon Sep 17 00:00:00 2001 From: "kh5325.kim" Date: Thu, 10 Oct 2013 16:36:54 +0900 Subject: [PATCH 01/16] send device name when incomming connection Change-Id: I3e8f2e3c18eeeee2008df2584538e929b0a949fd Signed-off-by: kh5325.kim --- src/sdb.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++---- src/sdb.h | 4 +++- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/sdb.c b/src/sdb.c index 0a6d7e7..aa75a82 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -29,6 +29,7 @@ #include "sysdeps.h" #include "sdb.h" +#include "strutils.h" #if !SDB_HOST #include @@ -36,7 +37,7 @@ #else #include "usb_vendors.h" #endif - +#include #define PROC_CMDLINE_PATH "/proc/cmdline" #if SDB_TRACE SDB_MUTEX_DEFINE( D_lock ); @@ -299,7 +300,7 @@ static void send_close(unsigned local, unsigned remote, atransport *t) p->msg.arg1 = remote; send_packet(p, t); } - +static int device_status = 0; // 0:online, 1: password locked later static void send_connect(atransport *t) { D("Calling send_connect \n"); @@ -307,9 +308,24 @@ static void send_connect(atransport *t) cp->msg.command = A_CNXN; cp->msg.arg0 = A_VERSION; cp->msg.arg1 = MAX_PAYLOAD; - snprintf((char*) cp->data, sizeof cp->data, "%s::", - HOST ? "host" : sdb_device_banner); + + char device_name[256]={0,}; + int r = 0; + + if (is_emulator()) { + r = get_emulator_name(device_name, sizeof device_name); + } else { + r = get_device_name(device_name, sizeof device_name); + } + if (r < 0) { + snprintf((char*) cp->data, sizeof cp->data, "%s::%s::%d", sdb_device_banner, DEFAULT_DEVICENAME, device_status); + } else { + snprintf((char*) cp->data, sizeof cp->data, "%s::%s::%d", sdb_device_banner, device_name, device_status); + } + + D("CNXN data:%s\n", (char*)cp->data); cp->msg.data_length = strlen((char*) cp->data) + 1; + send_packet(cp, t); #if SDB_HOST /* XXX why sleep here? */ @@ -401,6 +417,37 @@ int get_emulator_name(char str[], int str_size) { return 0; } +int get_device_name(char str[], int str_size) { + char *value = NULL; + int r = system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &value); + if (r != SYSTEM_INFO_ERROR_NONE) { + D("fail to get system model:%d\n", errno); + return -1; + } else { + s_strncpy(str, value, str_size); + D("returns model_name:%s\n", value); + if (value != NULL) { + free(value); + } + return 0; + } + /* + int fd = unix_open(USB_SERIAL_PATH, O_RDONLY); + if (fd < 0) { + D("fail to read:%s (%d)\n", USB_SERIAL_PATH, errno); + return -1; + } + + if(read_line(fd, str, str_size)) { + D("device serial name: %s\n", str); + sdb_close(fd); + return 0; + } + sdb_close(fd); + */ + return -1; +} + void parse_banner(char *banner, atransport *t) { char *type, *product, *end; diff --git a/src/sdb.h b/src/sdb.h index ad6acf1..01c8b40 100644 --- a/src/sdb.h +++ b/src/sdb.h @@ -340,6 +340,7 @@ void set_root_privileges(); int get_emulator_forward_port(void); int get_emulator_name(char str[], int str_size); +int get_device_name(char str[], int str_size); /* packet allocator */ apacket *get_apacket(void); void put_apacket(apacket *p); @@ -489,12 +490,13 @@ int sendfailmsg(int fd, const char *reason); int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s); int is_emulator(void); +#define DEFAULT_DEVICENAME "unknown" #if SDB_HOST /* tizen-specific */ #define DEVICEMAP_SEPARATOR ":" #define DEVICENAME_MAX 256 #define VMS_PATH OS_PATH_SEPARATOR_STR "vms" OS_PATH_SEPARATOR_STR // should include sysdeps.h above -#define DEFAULT_DEVICENAME "" + void register_device_name(const char *device_type, const char *device_name, int port); int get_devicename_from_shdmem(int port, char *device_name); int read_line(const int fd, char* ptr, const size_t maxlen); -- 2.7.4 From 88e59dbe2ec1f4f40b6af8e6dad150b57c7d1c83 Mon Sep 17 00:00:00 2001 From: "kh5325.kim" Date: Thu, 10 Oct 2013 21:32:23 +0900 Subject: [PATCH 02/16] cp sdbd.service file & clean up build script files Change-Id: Icfdd8a59092e7dd51a71ab87324a7a4f0726b4b3 Signed-off-by: kh5325.kim --- Makefile | 95 +---------------------------------------- packaging/sdbd.changes | 10 +++++ packaging/sdbd.spec | 38 ++++++++--------- packaging/sdbd_device.service | 10 +++++ packaging/sdbd_emulator.service | 15 +++++++ sdk_launch => script/sdk_launch | 0 6 files changed, 56 insertions(+), 112 deletions(-) create mode 100644 packaging/sdbd.changes create mode 100644 packaging/sdbd_device.service create mode 100644 packaging/sdbd_emulator.service rename sdk_launch => script/sdk_launch (100%) diff --git a/Makefile b/Makefile index 240e1be..dc0eb36 100644 --- a/Makefile +++ b/Makefile @@ -1,67 +1,8 @@ # # -# Makefile for sdb +# Makefile for sdbd # -# -HOST_OS := $(shell uname -s | tr A-Z a-z) - -# sdb host tool -# ========================================================= - -# Default to a virtual (sockets) usb interface -USB_SRCS := -EXTRA_SRCS := - -ifeq ($(HOST_OS),linux) - USB_SRCS := usb_linux.c - EXTRA_SRCS := get_my_path_linux.c - LOCAL_LDLIBS += -lrt -lncurses -lpthread -endif - -ifeq ($(HOST_OS),darwin) - USB_SRCS := usb_osx.c - EXTRA_SRCS := get_my_path_darwin.c - LOCAL_LDLIBS += -lpthread -framework CoreFoundation -framework IOKit -framework Carbon - SDB_EXTRA_CFLAGS := -mmacosx-version-min=10.4 -endif - -ifeq ($(HOST_OS),freebsd) - USB_SRCS := usb_libusb.c - EXTRA_SRCS := get_my_path_freebsd.c - LOCAL_LDLIBS += -lpthread -lusb -endif - - - -SDB_SRC_FILES := \ - src/sdb.c \ - src/console.c \ - src/transport.c \ - src/transport_local.c \ - src/transport_usb.c \ - src/commandline.c \ - src/sdb_client.c \ - src/sockets.c \ - src/services.c \ - src/file_sync_client.c \ - src/$(EXTRA_SRCS) \ - src/$(USB_SRCS) \ - src/utils.c \ - src/usb_vendors.c \ - src/fdevent.c \ - src/socket_inaddr_any_server.c \ - src/socket_local_client.c \ - src/socket_local_server.c \ - src/socket_loopback_client.c \ - src/socket_loopback_server.c \ - src/socket_network_client.c - -SDB_CFLAGS := -O2 -g -DSDB_HOST=1 -DSDB_HOST_ON_TARGET=1 -Wall -Wno-unused-parameter -SDB_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -SDB_CFLAGS += -DHAVE_FORKEXEC -DHAVE_TERMIO_H -DHAVE_SYMLINKS -SDB_LFLAGS := $(LOCAL_LDLIBS) - SDBD_SRC_FILES := \ src/sdb.c \ src/fdevent.c \ @@ -94,36 +35,11 @@ IFLAGS := -Iinclude -Isrc -I/usr/include/system OBJDIR := bin INSTALLDIR := usr/sbin INITSCRIPTDIR := etc/init.d -RCSCRIPTDIR := etc/rc.d/rc3.d -LAUNCH_SCRIPT := sdk_launch - -UNAME := $(shell uname -sm) -ifneq (,$(findstring 86,$(UNAME))) - HOST_ARCH := x86 -endif -TARGET_ARCH = $(HOST_ARCH) -ifeq ($(TARGET_ARCH),) - TARGET_ARCH := arm -endif - -ifeq ($(TARGET_ARCH),arm) - MODULE := sdbd - SDBD_CFLAGS += -DANDROID_GADGET=1 -else -ifeq ($(TARGET_HOST),true) - MODULE := sdb -else - MODULE := sdbd -endif -endif +MODULE := sdbd all : $(MODULE) -sdb : $(SDB_SRC_FILES) - mkdir -p $(OBJDIR) - $(CC) -pthread -o $(OBJDIR)/$(MODULE) $(SDB_CFLAGS) $(SDB_EXTRA_CFLAGS) $(SDB_LFLAGS) $(IFLAGS) $(SDB_SRC_FILES) - sdbd : $(SDBD_SRC_FILES) mkdir -p $(OBJDIR) $(CC) -pthread -o $(OBJDIR)/$(MODULE) $(SDBD_CFLAGS) $(IFLAGS) $(SDBD_SRC_FILES) $(SDBD_LFLAGS) @@ -131,15 +47,8 @@ sdbd : $(SDBD_SRC_FILES) install : mkdir -p $(DESTDIR)/$(INSTALLDIR) install $(OBJDIR)/$(MODULE) $(DESTDIR)/$(INSTALLDIR)/$(MODULE) - install $(LAUNCH_SCRIPT) $(DESTDIR)/$(INSTALLDIR)/$(LAUNCH_SCRIPT) -ifeq ($(MODULE),sdbd) mkdir -p $(DESTDIR)/$(INITSCRIPTDIR) install script/sdbd $(DESTDIR)/$(INITSCRIPTDIR)/sdbd -endif -ifeq ($(TARGET_ARCH),x86) - mkdir -p $(DESTDIR)/$(RCSCRIPTDIR) - install script/S06sdbd $(DESTDIR)/$(RCSCRIPTDIR)/S06sdbd -endif clean : rm -rf $(OBJDIR)/* diff --git a/packaging/sdbd.changes b/packaging/sdbd.changes new file mode 100644 index 0000000..89f04c3 --- /dev/null +++ b/packaging/sdbd.changes @@ -0,0 +1,10 @@ +* Wed Apr 04 2013 Ho Namkoong + - supports platform gdbserver +* Mon Dec 02 2012 Yoonki Park + - supports cs report service using inotify +* Mon Dec 02 2012 Yoonki Park + - sdb code dropped from adb (Ice Cream Samdwich 4.1.1) +* Wed Apr 18 2012 Yoonki Park + - set dir permission to 777 +* Sat Mar 31 2012 Yoonki Park + - let sshd be daemon and create sshd.pid file \ No newline at end of file diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 44b3fe4..049e4e9 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -1,10 +1,13 @@ Name: sdbd Summary: SDB daemon -Version: 2.2.8 -Release: 1 -Group: TO_BE/FILLED_IN -License: TO BE FILLED IN +Version: 2.2.13 +Release: 0 +License: Apache-2.0 +Summary: SDB daemon +Group: System/Utilities Source0: %{name}-%{version}.tar.gz +Source1001: sdbd_device.service +Source1002: sdbd_emulator.service BuildRequires: capi-system-info-devel Requires(post): pkgmgr @@ -17,7 +20,7 @@ Requires: debug-launchpad Requires: dbus %description -Description: SDB daemon +Description: SDB daemon. %prep @@ -32,7 +35,17 @@ rm -rf %{buildroot} mkdir -p %{buildroot}/usr/share/license cp LICENSE %{buildroot}/usr/share/license/%{name} + %make_install +mkdir -p %{buildroot}%{_libdir}/systemd/system +%if 0%{?simulator} +install -m 0644 %SOURCE1001 %{buildroot}%{_libdir}/systemd/system/sdbd.service +%else +install -m 0644 %SOURCE1002 %{buildroot}%{_libdir}/systemd/system/sdbd.service +%endif + +mkdir -p %{buildroot}%{_prefix}/sbin +install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ %post chsmack -a sdbd::home /home/developer @@ -45,19 +58,6 @@ chsmack -t /home/developer %{_prefix}/sbin/sdk_launch %{_sysconfdir}/init.d/sdbd /usr/share/license/%{name} - -%ifarch %{ix86} - %{_sysconfdir}/rc.d/rc3.d -%endif +%{_libdir}/systemd/system/sdbd.service %changelog -* Wed Apr 04 2013 Ho Namkoong - - supports platform gdbserver -* Mon Dec 02 2012 Yoonki Park - - supports cs report service using inotify -* Mon Dec 02 2012 Yoonki Park - - sdb code dropped from adb (Ice Cream Samdwich 4.1.1) -* Wed Apr 18 2012 Yoonki Park - - set dir permission to 777 -* Sat Mar 31 2012 Yoonki Park - - let sshd be daemon and create sshd.pid file diff --git a/packaging/sdbd_device.service b/packaging/sdbd_device.service new file mode 100644 index 0000000..0b92d85 --- /dev/null +++ b/packaging/sdbd_device.service @@ -0,0 +1,10 @@ +[Unit] +Description=sdbd +After=default.target + +[Service] +Type=forking +Environment=DISPLAY=:0 +PIDFile=/tmp/.sdbd.pid +RemainAfterExit=yes +ExecStart=/usr/sbin/sdbd diff --git a/packaging/sdbd_emulator.service b/packaging/sdbd_emulator.service new file mode 100644 index 0000000..274c3e9 --- /dev/null +++ b/packaging/sdbd_emulator.service @@ -0,0 +1,15 @@ +[Unit] +Description=sdbd +Before=sensord.service + +[Service] +Type=forking +Environment=DISPLAY=:0 +PIDFile=/tmp/.sdbd.pid +RemainAfterExit=yes +ExecStartPre=/bin/bash -c "/bin/echo `/bin/sed 's/^.*sdb_port=\([^, ]*\).*$/\1/g' /proc/cmdline` > /opt/home/sdb_port.txt" +ExecStart=/usr/sbin/sdbd + +[Install] +WantedBy=emulator.target + diff --git a/sdk_launch b/script/sdk_launch similarity index 100% rename from sdk_launch rename to script/sdk_launch -- 2.7.4 From 5b89f0c278e5ab86af922b3ab807cda6d9147891 Mon Sep 17 00:00:00 2001 From: "kh5325.kim" Date: Fri, 11 Oct 2013 17:39:10 +0900 Subject: [PATCH 03/16] fixed to cp sdbd.service file to right target Change-Id: Ie0c35ac38863615a4542102810aecc496af68168 Signed-off-by: kh5325.kim --- packaging/sdbd.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 4c31af7..27e89de 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -36,9 +36,9 @@ rm -rf %{buildroot} %make_install mkdir -p %{buildroot}%{_libdir}/systemd/system %if 0%{?simulator} -install -m 0644 %SOURCE1001 %{buildroot}%{_libdir}/systemd/system/sdbd.service -%else install -m 0644 %SOURCE1002 %{buildroot}%{_libdir}/systemd/system/sdbd.service +%else +install -m 0644 %SOURCE1001 %{buildroot}%{_libdir}/systemd/system/sdbd.service %endif mkdir -p %{buildroot}%{_prefix}/sbin -- 2.7.4 From 7e3c2611d02c00fb3f74b8d00eca2aa3659b0537 Mon Sep 17 00:00:00 2001 From: "yoonki.park" Date: Wed, 16 Oct 2013 15:58:45 +0900 Subject: [PATCH 04/16] remove resource leak Change-Id: I63610fd78399f58ddb7eac45d84c146f4fac7631 Signed-off-by: yoonki.park --- src/sdb.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sdb.c b/src/sdb.c index aa75a82..b726574 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -394,6 +394,7 @@ int get_emulator_forward_port() { port_buf[strlen(port_buf)-1]='\0'; port = strtol(port_buf, NULL, 10); } + sdb_close(fd); return port; } @@ -414,6 +415,7 @@ int get_emulator_name(char str[], int str_size) { return -1; } } + sdb_close(fd); return 0; } -- 2.7.4 From b365f8105d0612f98d57b68f05ffab17c9c686ed Mon Sep 17 00:00:00 2001 From: "yoonki.park" Date: Thu, 17 Oct 2013 13:32:21 +0900 Subject: [PATCH 05/16] verify system info pkg version dependency Change-Id: If5ea7679055f473e1d38ab14de1383354663f9c1 Signed-off-by: yoonki.park --- packaging/sdbd.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 27e89de..53c6391 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -9,7 +9,7 @@ Source0: %{name}-%{version}.tar.gz Source1001: sdbd_device.service Source1002: sdbd_emulator.service -BuildRequires: capi-system-info-devel +BuildRequires: capi-system-info-devel >= 0.2.0 Requires(post): pkgmgr Requires(post): pkgmgr-server Requires(post): wrt -- 2.7.4 From 10bfc881e596781cc128f83658b49918311bb456 Mon Sep 17 00:00:00 2001 From: "yoonki.park" Date: Fri, 11 Oct 2013 23:48:06 +0900 Subject: [PATCH 06/16] make link sdbd.service file to emulator target dir Change-Id: I26a4a042b694777dde1f60f79a977ef927cd59a0 Signed-off-by: yoonki.park --- packaging/sdbd.spec | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 53c6391..1161e9d 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -1,7 +1,7 @@ Name: sdbd Summary: SDB daemon Version: 2.2.13 -Release: 0 +Release: 1 License: Apache-2.0 Summary: SDB daemon Group: System/Utilities @@ -37,6 +37,8 @@ rm -rf %{buildroot} mkdir -p %{buildroot}%{_libdir}/systemd/system %if 0%{?simulator} install -m 0644 %SOURCE1002 %{buildroot}%{_libdir}/systemd/system/sdbd.service +mkdir -p %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants +ln -s %{_libdir}/systemd/system/sdbd.service %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants/ %else install -m 0644 %SOURCE1001 %{buildroot}%{_libdir}/systemd/system/sdbd.service %endif @@ -55,5 +57,8 @@ chsmack -t /home/developer %{_prefix}/sbin/sdk_launch %{_sysconfdir}/init.d/sdbd %{_libdir}/systemd/system/sdbd.service +%if 0%{?simulator} +%{_libdir}/systemd/system/emulator.target.wants/sdbd.service +%endif %changelog -- 2.7.4 From 23acaa596302c76366e25f249e1eb9d2ea4da0d3 Mon Sep 17 00:00:00 2001 From: Junfeng Dong Date: Thu, 31 Oct 2013 11:26:31 +0800 Subject: [PATCH 07/16] Fix some runtime issue in 3.0 set manifest request domain to floor. Remove wrong run time requires. Change-Id: I8598b9320faf7890dd47d51b0b4ce00751af7b62 Signed-off-by: Junfeng Dong --- packaging/sdbd.changes | 5 ++++- packaging/sdbd.manifest | 5 +++++ packaging/sdbd.spec | 16 ++++------------ sdbd.manifest | 31 ------------------------------- 4 files changed, 13 insertions(+), 44 deletions(-) create mode 100644 packaging/sdbd.manifest delete mode 100644 sdbd.manifest diff --git a/packaging/sdbd.changes b/packaging/sdbd.changes index 89f04c3..fc078af 100644 --- a/packaging/sdbd.changes +++ b/packaging/sdbd.changes @@ -1,3 +1,6 @@ +* Thu Oct 31 2013 Junfeng Dong submit/tizen/20131011.084016@81e3d5b +- Fix some runtime issue in 3.0 + * Wed Apr 04 2013 Ho Namkoong - supports platform gdbserver * Mon Dec 02 2012 Yoonki Park @@ -7,4 +10,4 @@ * Wed Apr 18 2012 Yoonki Park - set dir permission to 777 * Sat Mar 31 2012 Yoonki Park - - let sshd be daemon and create sshd.pid file \ No newline at end of file + - let sshd be daemon and create sshd.pid file diff --git a/packaging/sdbd.manifest b/packaging/sdbd.manifest new file mode 100644 index 0000000..86dbb26 --- /dev/null +++ b/packaging/sdbd.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 1161e9d..f7381a0 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -8,15 +8,10 @@ Group: System/Utilities Source0: %{name}-%{version}.tar.gz Source1001: sdbd_device.service Source1002: sdbd_emulator.service +Source1003: %{name}.manifest BuildRequires: capi-system-info-devel >= 0.2.0 -Requires(post): pkgmgr -Requires(post): pkgmgr-server -Requires(post): wrt -Requires(post): aul -Requires: default-files-tizen Requires: sys-assert -Requires: debug-launchpad Requires: dbus %description @@ -25,15 +20,15 @@ Description: SDB daemon. %prep %setup -q +cp %{SOURCE1003} . %build make %{?jobs:-j%jobs} %install -rm -rf %{buildroot} - %make_install + mkdir -p %{buildroot}%{_libdir}/systemd/system %if 0%{?simulator} install -m 0644 %SOURCE1002 %{buildroot}%{_libdir}/systemd/system/sdbd.service @@ -46,12 +41,9 @@ install -m 0644 %SOURCE1001 %{buildroot}%{_libdir}/systemd/system/sdbd.service mkdir -p %{buildroot}%{_prefix}/sbin install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ -%post -chsmack -a sdbd::home /home/developer -chsmack -t /home/developer - %files %manifest sdbd.manifest +%license LICENSE %defattr(-,root,root,-) %{_prefix}/sbin/sdbd %{_prefix}/sbin/sdk_launch diff --git a/sdbd.manifest b/sdbd.manifest deleted file mode 100644 index cc708a5..0000000 --- a/sdbd.manifest +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- 2.7.4 From 0289ceb6950258c15f7471a2c2ae4eba667a62a0 Mon Sep 17 00:00:00 2001 From: "yoonki.park" Date: Mon, 4 Nov 2013 14:36:46 +0900 Subject: [PATCH 08/16] version up to 3.0.0 Change-Id: Ie42c8f10e84d3ce3603306620459c1a600358e58 Signed-off-by: yoonki.park --- packaging/sdbd.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index f7381a0..c6a8de4 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -1,7 +1,7 @@ Name: sdbd Summary: SDB daemon -Version: 2.2.13 -Release: 1 +Version: 3.0.0 +Release: 0 License: Apache-2.0 Summary: SDB daemon Group: System/Utilities -- 2.7.4 From da60ed8dd45cc54f72e35688d0f016062ed4976e Mon Sep 17 00:00:00 2001 From: =?utf8?q?K=C3=A9vin=20THIERRY?= Date: Fri, 10 Jan 2014 16:10:21 +0100 Subject: [PATCH 09/16] Start sdbd at boot time MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Bug-Tizen: TIVI-2400 Change-Id: Idc9c4616ea36f0f51330626d60ecfd562d4edd16 Signed-off-by: Kévin THIERRY --- packaging/sdbd.changes | 3 +++ packaging/sdbd.spec | 10 +++++++--- packaging/sdbd_device.service | 5 ++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packaging/sdbd.changes b/packaging/sdbd.changes index fc078af..e1c0619 100644 --- a/packaging/sdbd.changes +++ b/packaging/sdbd.changes @@ -1,3 +1,6 @@ +* Fri Jan 10 2014 Kévin THIERRY accepted/tizen/20131112.015040@29f2623 +- Start sdbd at boot time + * Thu Oct 31 2013 Junfeng Dong submit/tizen/20131011.084016@81e3d5b - Fix some runtime issue in 3.0 diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index c6a8de4..1c65cb3 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -29,16 +29,18 @@ make %{?jobs:-j%jobs} %install %make_install -mkdir -p %{buildroot}%{_libdir}/systemd/system +install -d %{buildroot}%{_libdir}/systemd/system %if 0%{?simulator} install -m 0644 %SOURCE1002 %{buildroot}%{_libdir}/systemd/system/sdbd.service -mkdir -p %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants +install -d %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants ln -s %{_libdir}/systemd/system/sdbd.service %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants/ %else install -m 0644 %SOURCE1001 %{buildroot}%{_libdir}/systemd/system/sdbd.service +install -d %{buildroot}/%{_libdir}/systemd/system/multi-user.target.wants/ +ln -s %{_libdir}/systemd/system/%{name}.service %{buildroot}/%{_libdir}/systemd/system/multi-user.target.wants/ %endif -mkdir -p %{buildroot}%{_prefix}/sbin +install -d %{buildroot}%{_prefix}/sbin install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ %files @@ -51,6 +53,8 @@ install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ %{_libdir}/systemd/system/sdbd.service %if 0%{?simulator} %{_libdir}/systemd/system/emulator.target.wants/sdbd.service +%else +%{_libdir}/systemd/system/multi-user.target.wants/%{name}.service %endif %changelog diff --git a/packaging/sdbd_device.service b/packaging/sdbd_device.service index 0b92d85..295f594 100644 --- a/packaging/sdbd_device.service +++ b/packaging/sdbd_device.service @@ -1,6 +1,6 @@ [Unit] Description=sdbd -After=default.target +After=syslog.target [Service] Type=forking @@ -8,3 +8,6 @@ Environment=DISPLAY=:0 PIDFile=/tmp/.sdbd.pid RemainAfterExit=yes ExecStart=/usr/sbin/sdbd + +[Install] +WantedBy=multi-user.target -- 2.7.4 From 48009389842b30fed3707b0173068d20cb62df03 Mon Sep 17 00:00:00 2001 From: =?utf8?q?K=C3=A9vin=20THIERRY?= Date: Mon, 13 Jan 2014 04:27:48 -0800 Subject: [PATCH 10/16] Revert "Start sdbd at boot time" MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This reverts commit da60ed8dd45cc54f72e35688d0f016062ed4976e. Change-Id: I864d0df0e78bbcfddf5f19a9013d7e40549598e8 Signed-off-by: Kévin THIERRY --- packaging/sdbd.changes | 3 --- packaging/sdbd.spec | 10 +++------- packaging/sdbd_device.service | 5 +---- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/packaging/sdbd.changes b/packaging/sdbd.changes index e1c0619..fc078af 100644 --- a/packaging/sdbd.changes +++ b/packaging/sdbd.changes @@ -1,6 +1,3 @@ -* Fri Jan 10 2014 Kévin THIERRY accepted/tizen/20131112.015040@29f2623 -- Start sdbd at boot time - * Thu Oct 31 2013 Junfeng Dong submit/tizen/20131011.084016@81e3d5b - Fix some runtime issue in 3.0 diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 1c65cb3..c6a8de4 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -29,18 +29,16 @@ make %{?jobs:-j%jobs} %install %make_install -install -d %{buildroot}%{_libdir}/systemd/system +mkdir -p %{buildroot}%{_libdir}/systemd/system %if 0%{?simulator} install -m 0644 %SOURCE1002 %{buildroot}%{_libdir}/systemd/system/sdbd.service -install -d %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants +mkdir -p %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants ln -s %{_libdir}/systemd/system/sdbd.service %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants/ %else install -m 0644 %SOURCE1001 %{buildroot}%{_libdir}/systemd/system/sdbd.service -install -d %{buildroot}/%{_libdir}/systemd/system/multi-user.target.wants/ -ln -s %{_libdir}/systemd/system/%{name}.service %{buildroot}/%{_libdir}/systemd/system/multi-user.target.wants/ %endif -install -d %{buildroot}%{_prefix}/sbin +mkdir -p %{buildroot}%{_prefix}/sbin install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ %files @@ -53,8 +51,6 @@ install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ %{_libdir}/systemd/system/sdbd.service %if 0%{?simulator} %{_libdir}/systemd/system/emulator.target.wants/sdbd.service -%else -%{_libdir}/systemd/system/multi-user.target.wants/%{name}.service %endif %changelog diff --git a/packaging/sdbd_device.service b/packaging/sdbd_device.service index 295f594..0b92d85 100644 --- a/packaging/sdbd_device.service +++ b/packaging/sdbd_device.service @@ -1,6 +1,6 @@ [Unit] Description=sdbd -After=syslog.target +After=default.target [Service] Type=forking @@ -8,6 +8,3 @@ Environment=DISPLAY=:0 PIDFile=/tmp/.sdbd.pid RemainAfterExit=yes ExecStart=/usr/sbin/sdbd - -[Install] -WantedBy=multi-user.target -- 2.7.4 From 89f1249fe3462ce00f3aaa01494e4a8ba4bfade8 Mon Sep 17 00:00:00 2001 From: Aleksander Zdyb Date: Fri, 31 Jan 2014 12:00:45 +0100 Subject: [PATCH 11/16] Parse commandline of sdbd and make use of values provided Settings such as emulator name or ports are no longer parsed from /proc/cmdline. Individual ports can be now explicitly specified and not determined by some hardcoded arithmetical logic. An additional advantage is possibility to launch sdbd in tcp mode on specified IP and port. Moreover running on emulator or not is not determined at runtime, but rather passed as an option. Available options are: * -e, --emulator=HOST:PORT emulator's name and forward port * -c, --connect-to=HOST:PORT hostname or IP and port of sdb listening on host (for notification) * -s, --sensors=HOST:PORT hostname or IP and port of sensors daemon * -l, --listen-port=PORT port on which sdbd shall be listening on Some functions are rewritten to make use of commandline args: * is_emulator(), * get_emulator_forward_port(), * get_emulator_name(). send_msg_to_localhost_from_guest() is more generic now -- accepts hostname. Change-Id: I498ce3688019418548dc94c55c4ea8144be8687a Signed-off-by: Aleksander Zdyb --- Makefile | 3 +- packaging/sdbd_emulator.service | 4 +- src/commandline_sdbd.c | 142 ++++++++++++++++++++++++++ src/commandline_sdbd.h | 98 ++++++++++++++++++ src/sdb.c | 63 +++++------- src/sdb.h | 9 ++ src/transport_local.c | 108 ++++++++++++++------ test/test_commandline_sdbd.c | 216 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 571 insertions(+), 72 deletions(-) create mode 100644 src/commandline_sdbd.c create mode 100644 src/commandline_sdbd.h create mode 100644 test/test_commandline_sdbd.c diff --git a/Makefile b/Makefile index dc0eb36..6fef698 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,8 @@ SDBD_SRC_FILES := \ src/strutils.c \ src/libsmack.c \ src/init.c \ - src/fileutils.c + src/fileutils.c \ + src/commandline_sdbd.c SDBD_CFLAGS := -O2 -g -DSDB_HOST=0 -Wall -Wno-unused-parameter SDBD_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE diff --git a/packaging/sdbd_emulator.service b/packaging/sdbd_emulator.service index 274c3e9..3bcbcf1 100644 --- a/packaging/sdbd_emulator.service +++ b/packaging/sdbd_emulator.service @@ -7,9 +7,7 @@ Type=forking Environment=DISPLAY=:0 PIDFile=/tmp/.sdbd.pid RemainAfterExit=yes -ExecStartPre=/bin/bash -c "/bin/echo `/bin/sed 's/^.*sdb_port=\([^, ]*\).*$/\1/g' /proc/cmdline` > /opt/home/sdb_port.txt" -ExecStart=/usr/sbin/sdbd +ExecStart=/bin/sh -c "/usr/sbin/sdbd `/usr/bin/awk '{match($0, /sdb_port=([0-9]+)/,port_match); match($0, /vm_name=([^, ]*)/,vm_match); print \"--emulator=\" vm_match[1] \":\" port_match[1] \" --connect-to=10.0.2.2:26099\" \" --sensors=10.0.2.2:\"port_match[1]+3 \" --listen-port=\"port_match[1]+1 }' /proc/cmdline`" [Install] WantedBy=emulator.target - diff --git a/src/commandline_sdbd.c b/src/commandline_sdbd.c new file mode 100644 index 0000000..ccf75f2 --- /dev/null +++ b/src/commandline_sdbd.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "commandline_sdbd.h" +#include "sdb.h" + +#include +#include +#include + + +/*! + * @fn int split_host_port(const char *optarg, char **host, int *port) + * @brief Splits string of form \c "localhost:22" into \c host (string) + * and \c port (int) parts. + * + * @param optarg optarg from getopt + * @param host Where to put host part string + * @param port Where to put port part int + * + * @returns \ref SDBD_COMMANDLINE_SUCCESS on success + * or \ref SDBD_COMMANDLINE_FAILURE otherwise + */ +int split_host_port(const char *optarg, char **host, int *port); + +int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[]) { + int split_retval; + + int opt; + int long_index = 0; + + static struct option long_options[] = { + { ARG_EMULATOR_VM_NAME, required_argument, NULL, ARG_S_EMULATOR_VM_NAME }, + { ARG_SENSORS, required_argument, NULL, ARG_S_SENSORS }, + { ARG_SDB, required_argument, NULL, ARG_S_SDB }, + { ARG_SDBD_LISTEN_PORT, required_argument, NULL, ARG_S_SDBD_LISTEN_PORT }, + { NULL, 0, NULL, 0 } + }; + + optind = 1; /* the index of the next element to be processed in argv */ + + while ((opt = getopt_long(argc, argv, "", long_options, &long_index)) != -1) { + switch (opt) { + case ARG_S_EMULATOR_VM_NAME: + split_retval = split_host_port(optarg, + &sdbd_args->emulator.host, + &sdbd_args->emulator.port); + if (split_retval != SDBD_COMMANDLINE_SUCCESS) { + return split_retval; + } + break; + case ARG_S_SENSORS: + split_retval = split_host_port(optarg, + &sdbd_args->sensors.host, + &sdbd_args->sensors.port); + if (split_retval != SDBD_COMMANDLINE_SUCCESS) { + return split_retval; + } + break; + case ARG_S_SDB: + split_retval = split_host_port(optarg, + &sdbd_args->sdb.host, + &sdbd_args->sdb.port); + if (split_retval != SDBD_COMMANDLINE_SUCCESS) { + return split_retval; + } + break; + case ARG_S_SDBD_LISTEN_PORT: + if (sscanf(optarg, "%d", &sdbd_args->sdbd_port) < 1) { + return SDBD_COMMANDLINE_FAILURE; + } + break; + case 1: + return SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT; + case '?': + return SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT; + default: + return SDBD_COMMANDLINE_FAILURE; + } + } + + return SDBD_COMMANDLINE_SUCCESS; +} + + +void apply_sdbd_commandline_defaults(SdbdCommandlineArgs *sdbd_args) { + sdbd_args->sensors.host = strdup(QEMU_FORWARD_IP); + sdbd_args->sensors.port = DEFAULT_SENSORS_LOCAL_TRANSPORT_PORT; + + sdbd_args->sdb.host = strdup(QEMU_FORWARD_IP); + sdbd_args->sdb.port = DEFAULT_SDB_PORT; + + sdbd_args->sdbd_port = DEFAULT_SDB_LOCAL_TRANSPORT_PORT; +} + + +int split_host_port(const char *optarg, char **host, int *port) { + const char *colon = strchr(optarg, ':'); + char *old_val = NULL; + + if (colon) { + old_val = *host; + *host = strndup(optarg, colon - optarg); + if (sscanf(colon + 1, "%d", port) < 1) { + return SDBD_COMMANDLINE_FAILURE; + } + } else { + return SDBD_COMMANDLINE_FAILURE; + } + + if (old_val) { + free(old_val); + } + return SDBD_COMMANDLINE_SUCCESS; +} + + +void clear_sdbd_commandline_args(SdbdCommandlineArgs *sdbd_args) { + free(sdbd_args->emulator.host); + sdbd_args->emulator.host = NULL; + + free(sdbd_args->sdb.host); + sdbd_args->sdb.host = NULL; + + free(sdbd_args->sensors.host); + sdbd_args->sensors.host = NULL; + + memset(sdbd_args, 0, sizeof(SdbdCommandlineArgs)); +} diff --git a/src/commandline_sdbd.h b/src/commandline_sdbd.h new file mode 100644 index 0000000..9b070ad --- /dev/null +++ b/src/commandline_sdbd.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMANDLINE_SDBD_H +#define COMMANDLINE_SDBD_H + +#define ARG_EMULATOR_VM_NAME "emulator" +#define ARG_S_EMULATOR_VM_NAME 'e' + +#define ARG_SDBD_LISTEN_PORT "listen-port" +#define ARG_S_SDBD_LISTEN_PORT 'l' + +#define ARG_SDB "connect-to" +#define ARG_S_SDB 'c' + +#define ARG_SENSORS "sensors" +#define ARG_S_SENSORS 's' + +#define SDBD_COMMANDLINE_SUCCESS 0 ///< Success +#define SDBD_COMMANDLINE_FAILURE -1 ///< Generic failure +#define SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT -2 ///< Unknown option + +/*! + * @struct HostPort + * @brief A simple host:port tuple + */ +typedef struct { + char *host; + int port; +} HostPort; + +/*! + * @struct SdbdCommandlineArgs + * @brief Contains all values, which are read from commandline. + */ +typedef struct { + HostPort emulator; ///< emulator name and forward port + HostPort sdb; ///< sdb address + HostPort sensors; ///< sensors address + int sdbd_port; ///< Port to listen on in tcp mode +} SdbdCommandlineArgs; + + +/*! + * @fn int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[]) + * @brief Parses commandline and stores result in sdbd_args. + * + * @note \c argc and \c argv must be the ones passed to main() function, + * e.g. have program name as the first value. + * + * @param sdbd_args SdbdCommandlineArgs where arguments shall be put + * @param argc Count of arguments passed to the program (from main()) + * @param argv Array of pointers to the strings, which are program arguments (from main()) + * + * @returns \ref SDBD_COMMANDLINE_SUCCESS on success. On failure one of: + * - \ref SDBD_COMMANDLINE_FAILURE + * - \ref SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT + */ +int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char **argv); + + +/*! + * @fn void apply_sdbd_commandline_defaults(SdbdCommandlineArgs *sdbd_args) + * @brief Applies default values to \c sdbd_args. + * + * @param sdbd_args SdbdCommandlineArgs where values shall be put + * + * @note It won't free old values. + * @see \ref clear_sdbd_commandline_args + */ +void apply_sdbd_commandline_defaults(SdbdCommandlineArgs *sdbd_args); + + +/*! + * @fn void clear_sdbd_commandline_args(SdbdCommandlineArgs *sdbd_args) + * @brief Frees and clears \c sdbd_args 's members. + * + * @param sdbd_args SdbdCommandlineArgs to be cleared + * + * @note This function will generate segmentation fault, + * if string pointers are not allocated and not NULL-ed. + */ +void clear_sdbd_commandline_args(SdbdCommandlineArgs *sdbd_args); + +#endif /* COMMANDLINE_SDBD_H */ diff --git a/src/sdb.c b/src/sdb.c index b726574..42383d0 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -26,10 +26,15 @@ #include #include #include +#include + #include "sysdeps.h" #include "sdb.h" #include "strutils.h" +#if !SDB_HOST +#include "commandline_sdbd.h" +#endif #if !SDB_HOST #include @@ -45,12 +50,16 @@ SDB_MUTEX_DEFINE( D_lock ); int HOST = 0; +#if !SDB_HOST +SdbdCommandlineArgs sdbd_commandline_args; +#endif + int is_emulator(void) { - if (access(USB_NODE_FILE, F_OK) == 0) { - return 0; - } else { - return 1; - } +#if SDB_HOST + return 0; +#else + return sdbd_commandline_args.emulator.host != NULL; +#endif } void handle_sig_term(int sig) { @@ -374,48 +383,23 @@ static int get_str_cmdline(char *src, char *dest, char str[], int str_size) { } int get_emulator_forward_port() { - char cmdline[512]; - int fd = unix_open(PROC_CMDLINE_PATH, O_RDONLY); - char *port_str = "sdb_port="; - char port_buf[7]={0,}; - int port = -1; + SdbdCommandlineArgs *sdbd_args = &sdbd_commandline_args; /* alias */ - if (fd < 0) { + if (sdbd_args->emulator.host == NULL) { return -1; } - if(read_line(fd, cmdline, sizeof(cmdline))) { - D("qemu cmd: %s\n", cmdline); - if (get_str_cmdline(cmdline, port_str, port_buf, sizeof(port_buf)) < 1) { - D("could not get port from cmdline\n"); - sdb_close(fd); - return -1; - } - // FIXME: remove comma! - port_buf[strlen(port_buf)-1]='\0'; - port = strtol(port_buf, NULL, 10); - } - sdb_close(fd); - return port; + + return sdbd_args->emulator.port; } int get_emulator_name(char str[], int str_size) { - char cmdline[512]; - int fd = unix_open(PROC_CMDLINE_PATH, O_RDONLY); - char *name_str = "vm_name="; + SdbdCommandlineArgs *sdbd_args = &sdbd_commandline_args; /* alias */ - if (fd < 0) { - D("fail to read /proc/cmdline\n"); + if (sdbd_args->emulator.host == NULL) { return -1; } - if(read_line(fd, cmdline, sizeof(cmdline))) { - D("qemu cmd: %s\n", cmdline); - if (get_str_cmdline(cmdline, name_str, str, str_size) < 1) { - D("could not get emulator name from cmdline\n"); - sdb_close(fd); - return -1; - } - } - sdb_close(fd); + + s_strncpy(str, sdbd_args->emulator.host, str_size); return 0; } @@ -812,6 +796,7 @@ static BOOL WINAPI ctrlc_handler(DWORD type) static void sdb_cleanup(void) { + clear_sdbd_commandline_args(&sdbd_commandline_args); usb_cleanup(); // if(required_pid > 0) { // kill(required_pid, SIGKILL); @@ -1628,6 +1613,8 @@ int main(int argc, char **argv) //sdbd will never die on emulator! signal(SIGTERM, handle_sig_term); /* tizen specific */ + apply_sdbd_commandline_defaults(&sdbd_commandline_args); + parse_sdbd_commandline(&sdbd_commandline_args, argc, argv); return sdb_main(0, DEFAULT_SDB_PORT); #endif } diff --git a/src/sdb.h b/src/sdb.h index 01c8b40..e8bb48c 100644 --- a/src/sdb.h +++ b/src/sdb.h @@ -18,8 +18,13 @@ #define __SDB_H #include +#include #include "transport.h" /* readx(), writex() */ +#include "fdevent.h" +#if !SDB_HOST +#include "commandline_sdbd.h" +#endif #define MAX_PAYLOAD 4096 @@ -444,6 +449,7 @@ void sdb_qemu_trace(const char* fmt, ...); # define QEMU_FORWARD_IP "10.0.2.2" #define DEFAULT_SDB_LOCAL_TRANSPORT_PORT 26101 /* tizen specific */ +#define DEFAULT_SENSORS_LOCAL_TRANSPORT_PORT 26103 /* tizen specific */ #define SDB_CLASS 0xff #define SDB_SUBCLASS 0x20 //0x42 /* tizen specific */ @@ -483,6 +489,9 @@ int connection_state(atransport *t); extern int HOST; extern int SHELL_EXIT_NOTIFY_FD; +#if !SDB_HOST +extern SdbdCommandlineArgs sdbd_commandline_args; +#endif #define CHUNK_SIZE (64*1024) diff --git a/src/transport_local.c b/src/transport_local.c index ee59551..743ef2d 100644 --- a/src/transport_local.c +++ b/src/transport_local.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "sysdeps.h" #include @@ -32,6 +33,9 @@ #define TRACE_TAG TRACE_TRANSPORT #include "sdb.h" #include "strutils.h" +#if !SDB_HOST +#include "commandline_sdbd.h" +#endif #ifdef HAVE_BIG_ENDIAN #define H4(x) (((x) & 0xFF000000) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24) @@ -403,38 +407,79 @@ static const char _ok_resp[] = "ok"; #endif // !SDB_HOST #endif -static int send_msg_to_localhost_from_guest(int local_port, char *request, int sock_type) { - int ret, s; - struct sockaddr_in server; +/*! + * static int send_msg_to_host_from_guest(const char *hostname, int host_port, char *request, int sock_type) + * @brief Sends \c request to host using specified protocol + * + * @param hostname Hostname -- could be domain name or IP + * @param host_port Host port + * @param request Message to be sent to host + * @param protocol IP protocol to be used: IPPROTO_TCP or IPPROTO_UDP + * + * @returns 0 on success, -1 otherwise + * + * @note SOCK_STREAM will be used for IPPROTO_TCP as socket type + * and SOCK_DGRAM for IPPROTO_UDP + */ +static int send_msg_to_host_from_guest(const char *hostname, int host_port, char *request, int protocol) { + int sock = -1; + char port[32]; /* string decimal representation for getaddrinfo */ + struct addrinfo hints = {0}; + struct addrinfo *addresses, *curr_addr; + int getaddr_ret; + const char *protocol_name = "unknown"; /* for debug message */ + + switch(protocol) { + case IPPROTO_TCP: + protocol_name = "tcp"; + hints.ai_socktype = SOCK_STREAM; + break; + case IPPROTO_UDP: + protocol_name = "udp"; + hints.ai_socktype = SOCK_DGRAM; + break; + default: + D("unsupported protocol: %d", protocol); + return -1; + } - memset( &server, 0, sizeof(server) ); - server.sin_family = AF_INET; - server.sin_port = htons(local_port); - server.sin_addr.s_addr = inet_addr(QEMU_FORWARD_IP); + D("try to send notification to host(%s:%d) using %s:[%s]\n", hostname, host_port, protocol_name, request); - D("try to send notification to host(%s:%d) using %s:[%s]\n", QEMU_FORWARD_IP, local_port, (sock_type == 0) ? "tcp" : "udp", request); + hints.ai_family = AF_INET; - if (sock_type == 0) { - s = socket(AF_INET, SOCK_STREAM, 0); - } else { - s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - } - if (s < 0) { - D("could not create socket\n"); + sprintf(port, "%d", host_port); + getaddr_ret = getaddrinfo(hostname, port, &hints, &addresses); + + if (getaddr_ret != 0) { + D("could not resolve %s\n", hostname); return -1; } - ret = connect(s, (struct sockaddr*) &server, sizeof(server)); - if (ret < 0) { + + for(curr_addr = addresses; curr_addr != NULL; curr_addr = curr_addr->ai_next) { + sock = socket(curr_addr->ai_family, curr_addr->ai_socktype, curr_addr->ai_protocol); + if (sock == -1) + continue; + + if (connect(sock, curr_addr->ai_addr, curr_addr->ai_addrlen) != -1) + break; /* Success */ + + sdb_close(sock); + } + + if(curr_addr == NULL) { /* No address succeeded */ + freeaddrinfo(addresses); D("could not connect to server\n"); - sdb_close(s); return -1; } - if (sdb_write(s, request, strlen(request)) < 0) { + + freeaddrinfo(addresses); + + if (sdb_write(sock, request, strlen(request)) < 0) { D("could not send notification request to host\n"); - sdb_close(s); + sdb_close(sock); return -1; } - sdb_close(s); + sdb_close(sock); D("sent notification request to host\n"); return 0; @@ -444,27 +489,30 @@ static void notify_sdbd_startup() { char buffer[512]; char request[512]; + SdbdCommandlineArgs *sdbd_args = &sdbd_commandline_args; /* alias */ + // send the request to sdbserver - char vm_name[256]={0,}; - int base_port = get_emulator_forward_port(); - int r = get_emulator_name(vm_name, sizeof vm_name); + const char *vm_name = sdbd_args->emulator.host; + int sdbd_port = sdbd_args->sdbd_port; + int sensors_port = sdbd_args->sensors.port; + - if (base_port < 0 || r < 0) { + if (sdbd_port <= 0 || vm_name == NULL) { return; } // tell qemu sdbd is just started with udp char sensord_buf[16]; snprintf(sensord_buf, sizeof sensord_buf, "2\n"); - if (send_msg_to_localhost_from_guest(base_port + 3, sensord_buf, 1) < 0) { + if (send_msg_to_host_from_guest(sdbd_args->sensors.host, sensors_port, sensord_buf, IPPROTO_UDP) < 0) { D("could not send sensord noti request\n"); } - // tell sdb server emulator's vms name - snprintf(request, sizeof request, "host:emulator:%d:%s",base_port + 1, vm_name); - snprintf(buffer, sizeof buffer, "%04x%s", strlen(request), request ); + // tell sdb server emulator's vms name and forward port + snprintf(request, sizeof request, "host:emulator:%d:%s", sdbd_port, vm_name); + snprintf(buffer, sizeof buffer, "%04x%s", strlen(request), request); - if (send_msg_to_localhost_from_guest(DEFAULT_SDB_PORT, buffer, 0) <0) { + if (send_msg_to_host_from_guest(sdbd_args->sdb.host, sdbd_args->sdb.port, buffer, IPPROTO_TCP) < 0) { D("could not send sdbd noti request. it might sdb server has not been started yet.\n"); } } diff --git a/test/test_commandline_sdbd.c b/test/test_commandline_sdbd.c new file mode 100644 index 0000000..8d332f5 --- /dev/null +++ b/test/test_commandline_sdbd.c @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "commandline_sdbd.h" +#include "sdb.h" + +#include +#include +#include + +#include + +/*! + * @define print_nullable(s) + * Takes string (const char *) and returns it or "(null)" literal + * in case \c s is NULL. + */ +#define print_nullable(s) \ + (((s) == NULL) ? "(null)" : (s)) + + +/*! + * @define ck_hostport(hp, h, p) + * Check if HostPort contains given host and port + * + * Host strings are equal if both point to the same address (including NULL) + * or, provided none of them is NULL, if strcmp() == 0. + * + * @param hp \ref HostPort to be checked (const HostPort *) + * @param h hostname (const char *) to be checked against + * @param p port (\c int) to be checked against + */ +#define _ck_hostport(hp, h, p) \ + ( (((hp)->host == (h)) \ + || (((hp)->host) && (h) && (strcmp((hp)->host, (h)) == 0))) \ + && (hp)->port == (p) ) + + +/*! + * @define ck_assert_hostport_eq(hp,h,p) + * Makes assertion against HostPort containing given host and port + * + * @param hp \ref HostPort to be checked (const HostPort *) + * @param h hostname (const char *) to be checked against + * @param p port (\c int) to be checked against + * + * @see ck_hostport + */ +#define ck_assert_hostport_eq(hp,h,p) \ + (fail_unless(_ck_hostport(hp,h,p), "Assertion failed (%s,%d) != (%s, %d)", \ + print_nullable((hp)->host), (hp)->port, print_nullable(h), (p))) + + +void setup(void) { + +} + +void teardown(void) { + +} + + +START_TEST(test_ok) { + char *argv[] = { + "./test", + "--emulator=tizen:101", + "--listen-port=101", + "--sensors=localhost:103", + "--connect-to=localhost:99" + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + apply_sdbd_commandline_defaults(&sdbd_args); + int parse_res = parse_sdbd_commandline(&sdbd_args, 5, argv); + + if (parse_res != SDBD_COMMANDLINE_SUCCESS) { + ck_abort_msg("parsing commandline failed"); + return; + } + + ck_assert_hostport_eq(&sdbd_args.emulator, "tizen", 101); + ck_assert_hostport_eq(&sdbd_args.sensors, "localhost", 103); + ck_assert_hostport_eq(&sdbd_args.sdb, "localhost", 99); + ck_assert_int_eq(sdbd_args.sdbd_port, 101); + +} END_TEST + + +START_TEST(test_empty) { + char *argv[] = { + "./test" + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + int parse_res = parse_sdbd_commandline(&sdbd_args, 1, argv); + + if (parse_res != SDBD_COMMANDLINE_SUCCESS) { + ck_abort_msg("parsing commandline failed"); + return; + } + + /* Now check if sdbd_commandline_args was not tainted */ + SdbdCommandlineArgs zero_args; + memset(&zero_args, 0, sizeof(SdbdCommandlineArgs)); + if (memcmp(&sdbd_args, &zero_args, sizeof(SdbdCommandlineArgs)) != 0) { + ck_abort_msg("SdbdCommandlineArgs is tainted"); + } + +} END_TEST + + +START_TEST(test_unknown) { + char *argv[] = { + "./test", + "--emulator=tizen:26101", + "--unknown=true" + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + int parse_res = parse_sdbd_commandline(&sdbd_args, 3, argv); + + if (parse_res != SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT) { + ck_abort_msg("parsing commandline failed"); + return; + } + +} END_TEST + + +START_TEST(test_clear_args) { + SdbdCommandlineArgs sdbd_args = {0}; + + sdbd_args.emulator.host = strdup("emul_host"); + sdbd_args.emulator.port = 123456; + sdbd_args.sdb.host = strdup("sdb_host"); + sdbd_args.sdb.port = 623451; + sdbd_args.sensors.host = strdup("sdb_host"); + sdbd_args.sensors.port = 634512; + sdbd_args.sdbd_port = 543216; + + clear_sdbd_commandline_args(&sdbd_args); + + ck_assert_hostport_eq(&sdbd_args.emulator, NULL, 0); + ck_assert_hostport_eq(&sdbd_args.sensors, NULL, 0); + ck_assert_hostport_eq(&sdbd_args.sdb, NULL, 0); + ck_assert_int_eq(sdbd_args.sdbd_port, 0); +} END_TEST + + +START_TEST(test_double_clear) { + SdbdCommandlineArgs sdbd_args = {0}; + clear_sdbd_commandline_args(&sdbd_args); +} END_TEST + + +START_TEST(test_default_args) { + SdbdCommandlineArgs sdbd_args = {0}; + + apply_sdbd_commandline_defaults(&sdbd_args); + + ck_assert_hostport_eq(&sdbd_args.emulator, NULL, 0); + ck_assert_hostport_eq(&sdbd_args.sensors, QEMU_FORWARD_IP, DEFAULT_SENSORS_LOCAL_TRANSPORT_PORT); + ck_assert_hostport_eq(&sdbd_args.sdb, QEMU_FORWARD_IP, DEFAULT_SDB_PORT); + ck_assert_int_eq(sdbd_args.sdbd_port, DEFAULT_SDB_LOCAL_TRANSPORT_PORT); +} END_TEST + + +Suite *sdbd_commandline_suite (void) { + Suite *s = suite_create ("sdbd commandline"); + + TCase *tc_core = tcase_create ("Core"); + tcase_add_checked_fixture(tc_core, setup, teardown); + tcase_add_test (tc_core, test_ok); + tcase_add_test (tc_core, test_empty); + tcase_add_test (tc_core, test_unknown); + tcase_add_test (tc_core, test_clear_args); + tcase_add_test (tc_core, test_double_clear); + tcase_add_test (tc_core, test_default_args); + suite_add_tcase (s, tc_core); + + return s; +} + + +int run_tests(int print_output) { + int number_failed; + Suite *s = sdbd_commandline_suite(); + SRunner *sr = srunner_create (s); + srunner_run_all (sr, print_output); + number_failed = srunner_ntests_failed (sr); + srunner_free (sr); + return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} + + +#ifndef COMMANDLINE_SDBD_TESTS_NO_MAIN +int main(int argc, char *argv[]) { + return run_tests(CK_NORMAL); +} +#endif /* COMMANDLINE_SDBD_TESTS_NO_MAIN */ -- 2.7.4 From d90c3e9acf13e6cb9bb1a611c7d18074c34654e1 Mon Sep 17 00:00:00 2001 From: Aleksander Zdyb Date: Wed, 29 Jan 2014 15:22:43 +0100 Subject: [PATCH 12/16] Initial support for FunctionFS Add support for FunctionFS. It's not yet built by default, but can be enabled by substituting usb_linux_client.c with usb_funcfs_client.c. Change-Id: Id3209741e21c331ed239cdd6204b70e275224449 Signed-off-by: Aleksander Zdyb --- src/sdb.h | 1 + src/usb_funcfs_client.c | 577 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 578 insertions(+) create mode 100644 src/usb_funcfs_client.c diff --git a/src/sdb.h b/src/sdb.h index e8bb48c..8075d60 100644 --- a/src/sdb.h +++ b/src/sdb.h @@ -512,4 +512,5 @@ int read_line(const int fd, char* ptr, const size_t maxlen); #endif #endif +#define USB_FUNCFS_SDB_PATH "/dev/usbgadget/sdb" #define USB_NODE_FILE "/dev/samsung_sdb" diff --git a/src/usb_funcfs_client.c b/src/usb_funcfs_client.c new file mode 100644 index 0000000..0a2ff7e --- /dev/null +++ b/src/usb_funcfs_client.c @@ -0,0 +1,577 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include "sysdeps.h" + +#define TRACE_TAG TRACE_USB +#include "sdb.h" + +#define MAX_PACKET_SIZE_FS 64 +#define MAX_PACKET_SIZE_HS 512 + +#define cpu_to_le16(x) htole16(x) +#define cpu_to_le32(x) htole32(x) + +static const char ep0_path[] = USB_FUNCFS_SDB_PATH"/ep0"; +static const char ep1_path[] = USB_FUNCFS_SDB_PATH"/ep1"; +static const char ep2_path[] = USB_FUNCFS_SDB_PATH"/ep2"; + +static const struct { + struct usb_functionfs_descs_head header; + struct { + struct usb_interface_descriptor intf; + struct usb_endpoint_descriptor_no_audio source; + struct usb_endpoint_descriptor_no_audio sink; + } __attribute__((packed)) fs_descs, hs_descs; +} __attribute__((packed)) descriptors = { + .header = { + .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC), + .length = cpu_to_le32(sizeof(descriptors)), + .fs_count = 3, + .hs_count = 3, + }, + .fs_descs = { + .intf = { + .bLength = sizeof(descriptors.fs_descs.intf), + .bDescriptorType = USB_DT_INTERFACE, + .bInterfaceNumber = 0, + .bNumEndpoints = 2, + .bInterfaceClass = SDB_CLASS, + .bInterfaceSubClass = SDB_SUBCLASS, + .bInterfaceProtocol = SDB_PROTOCOL, + .iInterface = 1, /* first string from the provided table */ + }, + .source = { + .bLength = sizeof(descriptors.fs_descs.source), + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = 1 | USB_DIR_OUT, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = MAX_PACKET_SIZE_FS, + }, + .sink = { + .bLength = sizeof(descriptors.fs_descs.sink), + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = 2 | USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = MAX_PACKET_SIZE_FS, + }, + }, + .hs_descs = { + .intf = { + .bLength = sizeof(descriptors.hs_descs.intf), + .bDescriptorType = USB_DT_INTERFACE, + .bInterfaceNumber = 0, + .bNumEndpoints = 2, + .bInterfaceClass = SDB_CLASS, + .bInterfaceSubClass = SDB_SUBCLASS, + .bInterfaceProtocol = SDB_PROTOCOL, + .iInterface = 1, /* first string from the provided table */ + }, + .source = { + .bLength = sizeof(descriptors.hs_descs.source), + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = 1 | USB_DIR_OUT, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = MAX_PACKET_SIZE_HS, + }, + .sink = { + .bLength = sizeof(descriptors.hs_descs.sink), + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = 2 | USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = MAX_PACKET_SIZE_HS, + }, + }, +}; + +#define STR_INTERFACE "SDB Interface" + +static const struct { + struct usb_functionfs_strings_head header; + struct { + __le16 code; + const char str1[sizeof(STR_INTERFACE)]; + } __attribute__((packed)) lang0; +} __attribute__((packed)) strings = { + .header = { + .magic = cpu_to_le32(FUNCTIONFS_STRINGS_MAGIC), + .length = cpu_to_le32(sizeof(strings)), + .str_count = cpu_to_le32(1), + .lang_count = cpu_to_le32(1), + }, + .lang0 = { + cpu_to_le16(0x0409), /* en-us */ + STR_INTERFACE, + }, +}; + + +/* A local struct to store state of application */ +struct usb_handle +{ + const char *EP0_NAME; + const char *EP_IN_NAME; + const char *EP_OUT_NAME; + int control; + int bulk_out; /* "out" from the host's perspective => source for sdbd */ + int bulk_in; /* "in" from the host's perspective => sink for sdbd */ + sdb_cond_t notify; + sdb_mutex_t lock; + sdb_cond_t control_notify; + sdb_mutex_t control_lock; + sdb_cond_t kick_notify; + sdb_mutex_t kick_lock; + int ffs_enabled; + int needs_kick; +}; + + +/* + * Initializes FunctionFS by writing descriptors and strings + * to control endpoint (EP0) + */ +static void init_functionfs(struct usb_handle *h) +{ + ssize_t ret; + + sdb_mutex_lock(&h->control_lock); + + /* open control endpoint */ + D("OPENING %s\n", h->EP0_NAME); + h->control = sdb_open(h->EP0_NAME, O_RDWR); + if (h->control < 0) { + D("[ %s: cannot open control endpoint ]\n", h->EP0_NAME); + h->control = -errno; + goto error; + } + + /* write descriptors to control endpoint */ + D("[ %s: writing descriptors ]\n", h->EP0_NAME); + ret = sdb_write(h->control, &descriptors, sizeof(descriptors)); + if (ret < 0) { + D("[ %s: cannot write descriptors ]\n", h->EP0_NAME); + h->control = -errno; + goto error; + } + + /* write strings to control endpoint */ + D("[ %s: writing strings ]\n", h->EP0_NAME); + ret = sdb_write(h->control, &strings, sizeof(strings)); + if(ret < 0) { + D("[ %s: cannot write strings ]\n", h->EP0_NAME); + h->control = -errno; + goto error; + } + + sdb_cond_signal(&h->control_notify); + sdb_mutex_unlock(&h->control_lock); + + + /* once configuration is passed to FunctionFS, io endpoints can be opened */ + + /* open output endpoint */ + D("[ %s: opening ]\n", h->EP_OUT_NAME); + if ((h->bulk_out = sdb_open(h->EP_OUT_NAME, O_RDWR)) < 0) { + D("[ %s: cannot open bulk-out endpoint ]\n", h->EP_OUT_NAME); + h->bulk_out = -errno; + return; + } + + /* open input endpoint */ + D("[ %s: opening ]\n", h->EP_IN_NAME); + if ((h->bulk_in = sdb_open(h->EP_IN_NAME, O_RDWR)) < 0) { + D("[ %s: cannot open bulk-in endpoint ]\n", h->EP_IN_NAME); + h->bulk_in = -errno; + return; + } + + return; + +error: + sdb_mutex_unlock(&h->control_lock); +} + + +void usb_cleanup() +{ + /* nothing to do here */ +} + + +static void *usb_open_thread(void *x) +{ + struct usb_handle *usb = (struct usb_handle *)x; + + init_functionfs(usb); + if (usb->control < 0 || usb->bulk_in < 0 || usb->bulk_out < 0) { + D("[ opening device failed ]\n"); + return (void *)-1; + } + + D("[ opening device succeeded ]\n"); + + /* wait until the USB device becomes operational */ + sdb_mutex_lock(&usb->lock); + while (usb->ffs_enabled == 0) + sdb_cond_wait(&usb->notify, &usb->lock); + sdb_mutex_unlock(&usb->lock); + + D("[ usb_thread - registering device ]\n"); + register_usb_transport(usb, NULL, 1); /* writable transport */ + + while (1) { + /* wait until the USB device needs reset */ + D("%s: WAIT UNTIL NEEDS RESET\n", __func__); + sdb_mutex_lock(&usb->kick_lock); + while (usb->needs_kick != 1) + sdb_cond_wait(&usb->kick_notify, &usb->kick_lock); + usb->needs_kick = 0; + sdb_mutex_unlock(&usb->kick_lock); + + /* wait until the USB device becomes operational */ + D("%s: WAIT UNTIL OPERATIONAL\n", __func__); + sdb_mutex_lock(&usb->lock); + while (usb->ffs_enabled == 0) + sdb_cond_wait(&usb->notify, &usb->lock); + sdb_mutex_unlock(&usb->lock); + + D("[ usb_thread - registering device ]\n"); + register_usb_transport(usb, NULL, 1); /* writable transport */ + } + + /* never gets here */ + return 0; +} + + +/* + * Reads and dispatches control messages + * + * @returns cumulative size of read messages or negative error number + */ +static int read_control(struct usb_handle *usb) +{ + static const char *const names[] = { + [FUNCTIONFS_BIND] = "BIND", + [FUNCTIONFS_UNBIND] = "UNBIND", + [FUNCTIONFS_ENABLE] = "ENABLE", + [FUNCTIONFS_DISABLE] = "DISABLE", + [FUNCTIONFS_SETUP] = "SETUP", + [FUNCTIONFS_SUSPEND] = "SUSPEND", + [FUNCTIONFS_RESUME] = "RESUME", + }; + const struct usb_functionfs_event read_event; + int ret; + + /* Read events from control endpoint + Fortunately, FunctionFS guarantees reading of full event (or nothing), + so we're not bothered with ret < sizeof(read_event) */ + ret = sdb_read(usb->control, &read_event, sizeof(read_event)); + if (ret < 0) { + /* EAGAIN support will be useful, when non-blocking ep0 reads + are supported in FunctionFS */ + if (errno == EAGAIN) { + sleep(1); + return ret; + } + perror("ep0 read after poll"); + return ret; + } + + /* dispatch read event */ + switch (read_event.type) { + case FUNCTIONFS_RESUME: + case FUNCTIONFS_ENABLE: + D("FFSEvent %s\n", names[read_event.type]); + sdb_mutex_lock(&usb->lock); + usb->ffs_enabled = 1; + sdb_cond_signal(&usb->notify); + sdb_mutex_unlock(&usb->lock); + break; + + case FUNCTIONFS_SUSPEND: + case FUNCTIONFS_DISABLE: + D("FFSEvent %s\n", names[read_event.type]); + sdb_mutex_lock(&usb->lock); + usb->ffs_enabled = 0; + sdb_mutex_unlock(&usb->lock); + break; + + case FUNCTIONFS_BIND: + case FUNCTIONFS_UNBIND: + case FUNCTIONFS_SETUP: + D("FFSEvent %s\n", names[read_event.type]); + break; + + default: + D("FFSEvent event (type=%d) is unknown -- ignored\n", read_event.type); + break; + } + + return ret; +} + + +/* + * Polls for control messages + * + * Calls read_control if control messages arrive + */ +static void *usb_read_control(void *x) +{ + struct usb_handle *usb = (struct usb_handle *)x; + struct pollfd ep0_poll[1]; + int ret; + + sdb_mutex_lock(&usb->control_lock); + while (usb->control == -1) + sdb_cond_wait(&usb->control_notify, &usb->control_lock); + sdb_mutex_unlock(&usb->control_lock); + + while (1) { + ep0_poll[0].fd = usb->control; + ep0_poll[0].events = POLLIN; + + /* In fact, polling ep0 is not yet supported in FunctionFS, + but we want the code to be ready for it. + The current approach makes no harm, because poll returns + immediately and we end up waiting on read (in read_control()). */ + ret = poll(ep0_poll, 1, -1); + if (ret < 0) { + perror("poll on control endpoint"); + continue; + } + + if (ep0_poll[0].revents & POLLIN) { + ret = read_control(usb); + } + } + + return 0; +} + + +/* + * Writes data to bulkin_fd + * + * Blocks until length data is written or error occurs. + * + * @returns amount of bytes written or -1 on failure (errno is set) + */ +static int bulk_write(int bulkin_fd, const void *buf, size_t length) +{ + size_t count = 0; + int ret; + + do { + ret = sdb_write(bulkin_fd, buf + count, length - count); + if (ret < 0) { + if (errno != EINTR) + return ret; + } else + count += ret; + } while (count < length); + + D("[ bulk_write done fd=%d ]\n", bulkin_fd); + return count; +} + + +/* + * Writes data to bulk_in descriptor + * + * In fact, data is forwarded to bulk_write. + * + * @returns 0 on success and -1 on failure (errno is set) + */ +int usb_write(usb_handle *h, const void *data, int len) +{ + int n; + + D("about to write (fd=%d, len=%d)\n", h->bulk_in, len); + n = bulk_write(h->bulk_in, data, len); + if(n != len) { + D("ERROR: fd = %d, n = %d, errno = %d (%s)\n", + h->bulk_in, n, errno, strerror(errno)); + return -1; + } + D("[ done fd=%d ]\n", h->bulk_in); + return 0; +} + + +/* + * Reads data from bulkout_fd + * + * Blocks until length data is read or error occurs. + * + * @returns amount of bytes read or -1 on failure (errno is set) + */ +static int bulk_read(int bulkout_fd, void *buf, size_t length) +{ + size_t count = 0; + int ret; + + do { + D("%d: before sdb_read...\n", getpid()); + ret = sdb_read(bulkout_fd, buf + count, length - count); + D("%d: after sdb_read...\n", getpid()); + + if (ret < 0) { + if (errno != EINTR) { + return ret; + } + } else { + count += ret; + } + + } while (count < length); + + D("[ bulk_read done fd=%d ]\n", bulkout_fd); + return count; +} + + +/* + * Reads data from bulk_out descriptor + * + * In fact, reading task is forwarded to bulk_read. + * + * @returns 0 on success and -1 on failure (errno is set) + */ +int usb_read(usb_handle *h, void *data, int len) +{ + int n; + + D("%d: about to read (fd=%d, len=%d)\n", getpid(), h->bulk_out, len); + n = bulk_read(h->bulk_out, data, len); + if(n != len) { + D("ERROR: fd = %d, n = %d, errno = %d (%s)\n", + h->bulk_out, n, errno, strerror(errno)); + return -1; + } + D("[ done fd=%d ]\n", h->bulk_out); + return 0; +} + + +/* + * Checks if EP0 exists on filesystem + */ +int ep0_exists() +{ + struct stat statb; + return stat(ep0_path, &statb) == 0; +} + + +/* + * Initializes struct usb_handle with paths to endpoints + * + * Fails, if EP0 does not exist on filesystem. + * + * @returns 0 on success or -ENODEV on failure + */ +static int autoconfig(struct usb_handle *h) +{ + if (!ep0_exists()) { + return -ENODEV; + } + + h->EP0_NAME = ep0_path; + h->EP_OUT_NAME = ep1_path; + h->EP_IN_NAME = ep2_path; + return 0; +} + + +/* + * Creates and starts USB threads + */ +void usb_init() +{ + usb_handle *h; + sdb_thread_t tid; + + D("[ usb_init - using FunctionFS ]\n"); + + h = calloc(1, sizeof(usb_handle)); + if (autoconfig(h) < 0) { + fatal_errno("[ can't recognize usb FunctionFS bulk device ]\n"); + free(h); + return; + } + + h->control = h->bulk_out = h->bulk_in = -1; + h->ffs_enabled = h->needs_kick = 0; + + sdb_cond_init(&h->notify, 0); + sdb_mutex_init(&h->lock, 0); + + sdb_cond_init(&h->control_notify, 0); + sdb_mutex_init(&h->control_lock, 0); + + sdb_cond_init(&h->kick_notify, 0); + sdb_mutex_init(&h->kick_lock, 0); + + D("[ usb_init - starting thread ]\n"); + if(sdb_thread_create(&tid, usb_open_thread, h)) + fatal_errno("[ cannot create usb thread ]\n"); + + if(sdb_thread_create(&tid, usb_read_control, h)) + fatal_errno("[ cannot create usb read control thread ]\n"); +} + + +void usb_kick(usb_handle *h) +{ + int err; + + err = ioctl(h->bulk_in, FUNCTIONFS_CLEAR_HALT); + if (err < 0) + perror("[ reset source fd ]\n"); + + err = ioctl(h->bulk_out, FUNCTIONFS_CLEAR_HALT); + if (err < 0) + perror("reset sink fd"); + + sdb_mutex_lock(&h->kick_lock); + h->needs_kick = 1; + + /* notify usb_open_thread that we are disconnected */ + sdb_cond_signal(&h->kick_notify); + sdb_mutex_unlock(&h->kick_lock); +} + + +int usb_close(usb_handle *h) +{ + return 0; +} -- 2.7.4 From 214554b69cbf4b42c8a003eb51b6efc0332edc67 Mon Sep 17 00:00:00 2001 From: Aleksander Zdyb Date: Wed, 29 Jan 2014 15:20:04 +0100 Subject: [PATCH 13/16] Rewrite Makefile as CMakeLists.txt FunctionFS transport can be enabled by passing -DUSE_FUNCTION_FS to cmake. Unit tests building can be enabled by passing -DBUILD_UNIT_TESTS to cmake Signed-off-by: Aleksander Zdyb Change-Id: Ia4f394ab301a74b83e5846ba19931f0637f0d241 --- CMakeLists.txt | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 55 ---------------------------- packaging/sdbd.spec | 2 ++ test/CMakeLists.txt | 40 +++++++++++++++++++++ 4 files changed, 143 insertions(+), 55 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 Makefile create mode 100644 test/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c112d31 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,101 @@ +# Copyright (c) 2014 Samsung Electronics Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +cmake_minimum_required (VERSION 2.8.3) +project (sdbd) + +option(USE_FUNCTION_FS "Use FunctionFS" NO) +option(BUILD_UNIT_TESTS "Build unit tests" NO) + +set(sdbd_SRCS + src/sdb.c + src/fdevent.c + src/transport.c + src/transport_local.c + src/transport_usb.c + src/sockets.c + src/services.c + src/file_sync_service.c + src/utils.c + src/socket_inaddr_any_server.c + src/socket_local_client.c + src/socket_local_server.c + src/socket_loopback_client.c + src/socket_loopback_server.c + src/socket_network_client.c + src/properties.c + src/sdktools.c + src/strutils.c + src/libsmack.c + src/init.c + src/fileutils.c + src/commandline_sdbd.c +) + +include_directories(src) + +if(USE_FUNCTION_FS) + list(APPEND sdbd_SRCS src/usb_funcfs_client.c) +else() + list(APPEND sdbd_SRCS src/usb_linux_client.c) +endif() + +add_executable(sdbd ${sdbd_SRCS}) + +set_property( + TARGET sdbd + PROPERTY COMPILE_DEFINITIONS + SDB_HOST=0 + _DROP_PRIVILEGE + _FILE_OFFSET_BITS=64 +) + +set_property( + TARGET sdbd + APPEND PROPERTY COMPILE_DEFINITIONS + _XOPEN_SOURCE + _GNU_SOURCE + HAVE_FORKEXEC +) + +if(USE_FUNCTION_FS) + set_property( + TARGET sdbd + APPEND PROPERTY COMPILE_DEFINITIONS + USB_FUNCFS + ) +endif() + +include(FindPkgConfig) + +# Get capi-system-info +pkg_check_modules(CAPI_SYSTEM_INFO REQUIRED capi-system-info) +include_directories(${CAPI_SYSTEM_INFO_INCLUDE_DIRS}) + +# Get pthreads +find_package(Threads REQUIRED) + +# Add libraries (-l...) +target_link_libraries (sdbd ${CMAKE_THREAD_LIBS_INIT} ${CAPI_SYSTEM_INFO_LDFLAGS}) + +install(TARGETS sdbd DESTINATION /usr/sbin) +install(FILES script/sdbd DESTINATION /etc/init.d) + + +# Optionally build unit tests binary -- could be helpful during further development +if(BUILD_UNIT_TESTS) + enable_testing() + add_subdirectory(test) +endif() diff --git a/Makefile b/Makefile deleted file mode 100644 index 6fef698..0000000 --- a/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# -# -# Makefile for sdbd -# - -SDBD_SRC_FILES := \ - src/sdb.c \ - src/fdevent.c \ - src/transport.c \ - src/transport_local.c \ - src/transport_usb.c \ - src/sockets.c \ - src/services.c \ - src/file_sync_service.c \ - src/usb_linux_client.c \ - src/utils.c \ - src/socket_inaddr_any_server.c \ - src/socket_local_client.c \ - src/socket_local_server.c \ - src/socket_loopback_client.c \ - src/socket_loopback_server.c \ - src/socket_network_client.c \ - src/properties.c \ - src/sdktools.c \ - src/strutils.c \ - src/libsmack.c \ - src/init.c \ - src/fileutils.c \ - src/commandline_sdbd.c - -SDBD_CFLAGS := -O2 -g -DSDB_HOST=0 -Wall -Wno-unused-parameter -SDBD_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -SDBD_CFLAGS += -DHAVE_FORKEXEC -fPIE -D_DROP_PRIVILEGE -D_FILE_OFFSET_BITS=64 -SDBD_LFLAGS := -lcapi-system-info -IFLAGS := -Iinclude -Isrc -I/usr/include/system -OBJDIR := bin -INSTALLDIR := usr/sbin -INITSCRIPTDIR := etc/init.d - -MODULE := sdbd - -all : $(MODULE) - -sdbd : $(SDBD_SRC_FILES) - mkdir -p $(OBJDIR) - $(CC) -pthread -o $(OBJDIR)/$(MODULE) $(SDBD_CFLAGS) $(IFLAGS) $(SDBD_SRC_FILES) $(SDBD_LFLAGS) - -install : - mkdir -p $(DESTDIR)/$(INSTALLDIR) - install $(OBJDIR)/$(MODULE) $(DESTDIR)/$(INSTALLDIR)/$(MODULE) - mkdir -p $(DESTDIR)/$(INITSCRIPTDIR) - install script/sdbd $(DESTDIR)/$(INITSCRIPTDIR)/sdbd - -clean : - rm -rf $(OBJDIR)/* diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index c6a8de4..d565618 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -11,6 +11,7 @@ Source1002: sdbd_emulator.service Source1003: %{name}.manifest BuildRequires: capi-system-info-devel >= 0.2.0 +BuildRequires: cmake >= 2.8.3 Requires: sys-assert Requires: dbus @@ -23,6 +24,7 @@ Description: SDB daemon. cp %{SOURCE1003} . %build +%cmake make %{?jobs:-j%jobs} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..ddc80ad --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,40 @@ +# Copyright (c) 2014 Samsung Electronics Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +cmake_minimum_required (VERSION 2.8.3) +project (sdbd_tests) + +include(FindPkgConfig) +pkg_check_modules(CHECK check>=0.9.8 REQUIRED) + +enable_testing() + +add_executable(sdbd_tests ../src/commandline_sdbd.c test_commandline_sdbd.c) + +set_property( + TARGET sdbd_tests + APPEND PROPERTY COMPILE_DEFINITIONS + _XOPEN_SOURCE + _GNU_SOURCE +) + +include_directories(../src) + +include_directories(${CHECK_INCLUDE_DIRS}) +target_link_libraries (sdbd_tests ${CHECK_LDFLAGS}) + +add_test(InternalUnitTests sdbd_tests) +set_tests_properties(InternalUnitTests PROPERTIES + PASS_REGULAR_EXPRESSION "100%: Checks: [0-9]+, Failures: 0, Errors: 0") -- 2.7.4 From f43ef3885270ab68a339fdee8754e3b3d24cdc27 Mon Sep 17 00:00:00 2001 From: Mikko Ylinen Date: Wed, 5 Feb 2014 06:39:28 +0200 Subject: [PATCH 14/16] Remove sys-assert dependency sys-assert controls how core dumps are handled in the system. It provides a system/image wide capability. Product images might choose not to install it or they might prefer an alternative core dump service (e.g., systemd coredump). Therefore, individual packages should not explicitly depend on sys-assert. Change-Id: Icd83879a9f676464c2fae4f06676c7e8fabd53e6 Signed-off-by: Mikko Ylinen --- packaging/sdbd.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index d565618..46de0bf 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -12,7 +12,6 @@ Source1003: %{name}.manifest BuildRequires: capi-system-info-devel >= 0.2.0 BuildRequires: cmake >= 2.8.3 -Requires: sys-assert Requires: dbus %description -- 2.7.4 From b4d305e5e1cefa42d3300f7601493bce58f9c107 Mon Sep 17 00:00:00 2001 From: "yoonki.park" Date: Thu, 20 Feb 2014 22:03:15 +0900 Subject: [PATCH 15/16] Version up to 3.0.1 to add the following changes: - Remove sys-assert dependency - Rewrite Makefile as CMakeLists.txt - Initial support for FunctionFS - Parse commandline of sdbd and make use of values provided Signed-off-by: yoonki.park Change-Id: Iafa2e549047b6b49e34ba785a210e8912e4f4ffc --- packaging/sdbd.changes | 2 ++ packaging/sdbd.spec | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packaging/sdbd.changes b/packaging/sdbd.changes index fc078af..b923b27 100644 --- a/packaging/sdbd.changes +++ b/packaging/sdbd.changes @@ -1,3 +1,5 @@ +* Thu Feb 20 2014 Yoonki Park +- Version up to 3.0.1 * Thu Oct 31 2013 Junfeng Dong submit/tizen/20131011.084016@81e3d5b - Fix some runtime issue in 3.0 diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 46de0bf..2ae0f51 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -1,6 +1,6 @@ Name: sdbd Summary: SDB daemon -Version: 3.0.0 +Version: 3.0.1 Release: 0 License: Apache-2.0 Summary: SDB daemon -- 2.7.4 From ebdc294f10aa206edc8ed3fd4192cdaaef0b0952 Mon Sep 17 00:00:00 2001 From: Aleksander Zdyb Date: Fri, 7 Mar 2014 12:52:17 +0100 Subject: [PATCH 16/16] Add --usage/--help commandline options Change-Id: I22581e04b24bbad6ee587fc93b91a89506fc4f8b Signed-off-by: Aleksander Zdyb --- src/commandline_sdbd.c | 27 ++++++++++++++ src/commandline_sdbd.h | 17 +++++++++ src/sdb.c | 21 ++++++++++- test/test_commandline_sdbd.c | 87 ++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 142 insertions(+), 10 deletions(-) diff --git a/src/commandline_sdbd.c b/src/commandline_sdbd.c index ccf75f2..f1c3f55 100644 --- a/src/commandline_sdbd.c +++ b/src/commandline_sdbd.c @@ -47,6 +47,8 @@ int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[ { ARG_SENSORS, required_argument, NULL, ARG_S_SENSORS }, { ARG_SDB, required_argument, NULL, ARG_S_SDB }, { ARG_SDBD_LISTEN_PORT, required_argument, NULL, ARG_S_SDBD_LISTEN_PORT }, + { ARG_HELP, no_argument, NULL, ARG_S_HELP }, + { ARG_USAGE, no_argument, NULL, ARG_S_USAGE }, { NULL, 0, NULL, 0 } }; @@ -83,6 +85,10 @@ int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[ return SDBD_COMMANDLINE_FAILURE; } break; + case ARG_S_HELP: + return SDBD_COMMANDLINE_HELP; + case ARG_S_USAGE: + return SDBD_COMMANDLINE_USAGE; case 1: return SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT; case '?': @@ -140,3 +146,24 @@ void clear_sdbd_commandline_args(SdbdCommandlineArgs *sdbd_args) { memset(sdbd_args, 0, sizeof(SdbdCommandlineArgs)); } + + +void print_sdbd_usage_message(FILE *stream) { + const char *format = "Usage sdbd [OPTION]...\n" + "\t-%c, --%s=HOST:PORT\temulator's name and forward port\n" + "\t-%c, --%s=HOST:PORT\thostname or IP and port of sdb listening on host\n" + "\t-%c, --%s=HOST:PORT \thostname or IP and port of sensors daemon\n" + "\t-%c, --%s=PORT \tport on which sdbd shall be listening on\n" + "\t-%c, --%s \tprint help message\n" + "\t-%c, --%s \tprint this usage message\n" + ; + + fprintf(stream, format, + ARG_S_EMULATOR_VM_NAME, ARG_EMULATOR_VM_NAME, + ARG_S_SDB, ARG_SDB, + ARG_S_SENSORS, ARG_SENSORS, + ARG_S_SDBD_LISTEN_PORT, ARG_SDBD_LISTEN_PORT, + ARG_S_HELP, ARG_HELP, + ARG_S_USAGE, ARG_USAGE + ); +} diff --git a/src/commandline_sdbd.h b/src/commandline_sdbd.h index 9b070ad..598b478 100644 --- a/src/commandline_sdbd.h +++ b/src/commandline_sdbd.h @@ -29,9 +29,17 @@ #define ARG_SENSORS "sensors" #define ARG_S_SENSORS 's' +#define ARG_HELP "help" +#define ARG_S_HELP 'h' + +#define ARG_USAGE "usage" +#define ARG_S_USAGE 'u' + #define SDBD_COMMANDLINE_SUCCESS 0 ///< Success #define SDBD_COMMANDLINE_FAILURE -1 ///< Generic failure #define SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT -2 ///< Unknown option +#define SDBD_COMMANDLINE_HELP 1 ///< Help request +#define SDBD_COMMANDLINE_USAGE 2 ///< Usage message request /*! * @struct HostPort @@ -53,6 +61,7 @@ typedef struct { int sdbd_port; ///< Port to listen on in tcp mode } SdbdCommandlineArgs; +#include /*! * @fn int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[]) @@ -95,4 +104,12 @@ void apply_sdbd_commandline_defaults(SdbdCommandlineArgs *sdbd_args); */ void clear_sdbd_commandline_args(SdbdCommandlineArgs *sdbd_args); +/*! + * @fn void print_usage_message(FILE *stream) + * @brief Prints usage message to specified \stream + * + * @param stream Stream to print to + */ +void print_sdbd_usage_message(FILE *stream); + #endif /* COMMANDLINE_SDBD_H */ diff --git a/src/sdb.c b/src/sdb.c index 42383d0..d61cdc0 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1603,6 +1603,25 @@ int main(int argc, char **argv) recovery_mode = 1; } #endif + + apply_sdbd_commandline_defaults(&sdbd_commandline_args); + int parse_ret = parse_sdbd_commandline(&sdbd_commandline_args, argc, argv); + + // TODO: Add detailed error messages + // TODO: Add individual messages for help and usage + if(parse_ret != SDBD_COMMANDLINE_SUCCESS) { + if (parse_ret == SDBD_COMMANDLINE_HELP + || parse_ret == SDBD_COMMANDLINE_USAGE) { + // User requested help or usage + print_sdbd_usage_message(stdout); + return EXIT_SUCCESS; + } + + // Print usage message because of invalid options + print_sdbd_usage_message(stderr); + return EXIT_FAILURE; + } + #if !SDB_HOST if (daemonize() < 0) fatal("daemonize() failed: %.200s", strerror(errno)); @@ -1613,8 +1632,6 @@ int main(int argc, char **argv) //sdbd will never die on emulator! signal(SIGTERM, handle_sig_term); /* tizen specific */ - apply_sdbd_commandline_defaults(&sdbd_commandline_args); - parse_sdbd_commandline(&sdbd_commandline_args, argc, argv); return sdb_main(0, DEFAULT_SDB_PORT); #endif } diff --git a/test/test_commandline_sdbd.c b/test/test_commandline_sdbd.c index 8d332f5..4dd67e8 100644 --- a/test/test_commandline_sdbd.c +++ b/test/test_commandline_sdbd.c @@ -64,6 +64,10 @@ print_nullable((hp)->host), (hp)->port, print_nullable(h), (p))) +#define array_size(a) \ + (sizeof(a) / sizeof((a)[0])) + + void setup(void) { } @@ -73,8 +77,8 @@ void teardown(void) { } -START_TEST(test_ok) { - char *argv[] = { +START_TEST(test_all_opts) { + char *test_argv[] = { "./test", "--emulator=tizen:101", "--listen-port=101", @@ -85,7 +89,7 @@ START_TEST(test_ok) { SdbdCommandlineArgs sdbd_args = {0}; apply_sdbd_commandline_defaults(&sdbd_args); - int parse_res = parse_sdbd_commandline(&sdbd_args, 5, argv); + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); if (parse_res != SDBD_COMMANDLINE_SUCCESS) { ck_abort_msg("parsing commandline failed"); @@ -101,13 +105,13 @@ START_TEST(test_ok) { START_TEST(test_empty) { - char *argv[] = { + char *test_argv[] = { "./test" }; SdbdCommandlineArgs sdbd_args = {0}; - int parse_res = parse_sdbd_commandline(&sdbd_args, 1, argv); + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); if (parse_res != SDBD_COMMANDLINE_SUCCESS) { ck_abort_msg("parsing commandline failed"); @@ -125,7 +129,7 @@ START_TEST(test_empty) { START_TEST(test_unknown) { - char *argv[] = { + char *test_argv[] = { "./test", "--emulator=tizen:26101", "--unknown=true" @@ -133,7 +137,7 @@ START_TEST(test_unknown) { SdbdCommandlineArgs sdbd_args = {0}; - int parse_res = parse_sdbd_commandline(&sdbd_args, 3, argv); + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); if (parse_res != SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT) { ck_abort_msg("parsing commandline failed"); @@ -181,17 +185,84 @@ START_TEST(test_default_args) { } END_TEST +START_TEST(test_usage_message) { + FILE *stream; + char *buffer = NULL; + size_t buf_len = 0; + + stream = open_memstream(&buffer, &buf_len); + print_sdbd_usage_message(stream); + fclose(stream); + + // Just check if all options are mentioned in usage message + ck_assert(strstr(buffer, "--"ARG_EMULATOR_VM_NAME) != NULL); + ck_assert(strstr(buffer, "--"ARG_SDBD_LISTEN_PORT) != NULL); + ck_assert(strstr(buffer, "--"ARG_SDB) != NULL); + ck_assert(strstr(buffer, "--"ARG_SENSORS) != NULL); + ck_assert(strstr(buffer, "--"ARG_HELP) != NULL); + ck_assert(strstr(buffer, "--"ARG_USAGE) != NULL); + + free(buffer); +} END_TEST + +START_TEST(test_usage) { + char *test_argv[] = { + "./test", + "--usage" + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); + ck_assert_int_eq(parse_res, SDBD_COMMANDLINE_USAGE); + +} END_TEST + + +START_TEST(test_help) { + char *test_argv[] = { + "./test", + "--help" + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); + ck_assert_int_eq(parse_res, SDBD_COMMANDLINE_HELP); + +} END_TEST + + +START_TEST(test_help_other_opt) { + char *test_argv[] = { + "./test", + "--listen-port=1234", + "--help" + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); + ck_assert_int_eq(parse_res, SDBD_COMMANDLINE_HELP); + +} END_TEST + + Suite *sdbd_commandline_suite (void) { Suite *s = suite_create ("sdbd commandline"); TCase *tc_core = tcase_create ("Core"); tcase_add_checked_fixture(tc_core, setup, teardown); - tcase_add_test (tc_core, test_ok); + tcase_add_test (tc_core, test_all_opts); tcase_add_test (tc_core, test_empty); tcase_add_test (tc_core, test_unknown); tcase_add_test (tc_core, test_clear_args); tcase_add_test (tc_core, test_double_clear); tcase_add_test (tc_core, test_default_args); + tcase_add_test (tc_core, test_usage_message); + tcase_add_test (tc_core, test_usage); + tcase_add_test (tc_core, test_help); + tcase_add_test (tc_core, test_help_other_opt); suite_add_tcase (s, tc_core); return s; -- 2.7.4