ENDIF()
ENDIF()
-# usb client
-IF(${USB_MODULE} STREQUAL on)
- ADD_SOURCE(src/usb USB_SRCS)
- SET(SRCS ${SRCS} ${USB_SRCS})
-ENDIF()
-
-# usb host
-IF(${USBHOST_MODULE} STREQUAL on)
- ADD_SOURCE(src/usbhost USBHOST_SRCS)
- SET(SRCS ${SRCS} ${USBHOST_SRCS})
-ENDIF()
-
-IF(TIZEN_FEATURE_USBHOST_TEST STREQUAL on)
- ADD_SOURCE(src/usb-host-test USB_HOST_TEST_SRCS)
- SET(SRCS ${SRCS} ${USB_HOST_TEST_SRCS})
- INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/usb-host-test/test_gadget.gs
- DESTINATION /etc/deviced/usb-host-test/)
-ENDIF()
-
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/deviced)
IF(BLOCK_MODULE STREQUAL on)
SET(PKG_MODULES ${PKG_MODULES} storage app2sd capi-system-info)
ENDIF()
-IF(TIZEN_FEATURE_USBHOST_TEST STREQUAL on)
- SET(PKG_MODULES ${PKG_MODULES} libkmod libusbg)
-ENDIF()
INCLUDE(FindPkgConfig)
pkg_check_modules(pkgs REQUIRED ${PKG_MODULES})
INSTALL_CONF(src/display display)
ENDIF()
-# USB connection
-IF(${USB_MODULE} STREQUAL on)
- INSTALL_CONF(src/usb usb-operation)
-
- # USB (Manual setting)
- IF(${SDB_PRESTART} STREQUAL on)
- INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/systemd/sdb-prestart.service DESTINATION lib/systemd/system)
- ENDIF(${SDB_PRESTART} STREQUAL on)
-ENDIF()
-
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/${PROJECT_NAME}.conf DESTINATION /etc/dbus-1/system.d)
CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
FILES_MATCHING
PATTERN "*.service"
PATTERN "*.socket"
- PATTERN "sdb-prestart.service" EXCLUDE
PATTERN "deviced-vibrator.service" EXCLUDE
- PATTERN "usb-host*" EXCLUDE)
+ )
-IF(TIZEN_FEATURE_USBHOST_TEST STREQUAL on)
- INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/systemd/usb-host-ffs-test-daemon.service
- DESTINATION lib/systemd/system)
- INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/systemd/usb-host-test.socket
- DESTINATION lib/systemd/system)
-ENDIF()
ADD_SUBDIRECTORY(src/shared)
ADD_SUBDIRECTORY(src/libdeviced)
IF(HAPTIC_MODULE STREQUAL on)
ADD_SUBDIRECTORY(src/haptic)
ENDIF()
-IF(TIZEN_FEATURE_USBHOST_TEST STREQUAL on)
- ADD_SUBDIRECTORY(src/usb-host-ffs-test-daemon)
-ENDIF()
%bcond_with wayland
%bcond_with emulator
+%define _unpackaged_files_terminate_build 0
%define daemon_name pass
%define libdaemon_name lib%{daemon_name}
%define haptic_module off
%define power_module on
%define touchscreen_module off
-%define usb_module on
-%define usbhost_module off
-%define TIZEN_FEATURE_USBHOST_TEST off
-
-#Just For debugging
-%define sdb_prestart off
# Support two pattern combination vibration
%define standard_mix off
%if "%{?profile}" == "mobile"
%define haptic_module on
%define touchscreen_module on
-%define usbhost_module on
-%define TIZEN_FEATURE_USBHOST_TEST on
%endif
%if "%{?profile}" == "wearable"
%define haptic_module on
%endif
%if "%{?profile}" == "tv"
%define block_tmpfs on
-%define sdb_prestart off
-%define usbhost_module on
%endif
%if "%{?profile}" == "ivi"
%if "%{?_repository}" == "x86_64"
BuildRequires: pkgconfig(app2sd)
BuildRequires: pkgconfig(capi-system-info)
%endif
-%if %{?TIZEN_FEATURE_USBHOST_TEST} == on
-BuildRequires: pkgconfig(libkmod)
-BuildRequires: pkgconfig(libusbg)
-%endif
Requires: %{name}-tools = %{version}-%{release}
%{?systemd_requires}
-DHAPTIC_MODULE=%{haptic_module} \
-DSTANDARD_MIX=%{standard_mix} \
-DPOWER_MODULE=%{power_module} \
- -DSDB_PRESTART=%{sdb_prestart} \
-DTOUCHSCREEN_MODULE=%{touchscreen_module} \
- -DUSB_MODULE=%{usb_module} \
- -DUSBHOST_MODULE=%{usbhost_module} \
- -DTIZEN_FEATURE_USBHOST_TEST=%{TIZEN_FEATURE_USBHOST_TEST} \
#eol
%build
%install_service multi-user.target.wants deviced-vibrator.service
%endif
-%if %{?usb_module} == on && %{?sdb_prestart} == on
-%install_service basic.target.wants sdb-prestart.service
-%endif
-
-%if %{?usbhost_module} == on
-mkdir -p %{buildroot}%{_prefix}/lib/udev/rules.d
-install -m 644 udev/99-usbhost.rules %{buildroot}%{_prefix}/lib/udev/rules.d/99-usbhost.rules
-%endif
-
%post
#memory type vconf key init
users_gid=$(getent group %{TZ_SYS_USER_GROUP} | cut -f3 -d':')
%if %{?display_module} == on
%config %{_sysconfdir}/deviced/display.conf
%endif
-%if %{?usb_module} == on
-%config %{_sysconfdir}/deviced/usb-operation.conf
-%if %{?sdb_prestart} == on
-%{_unitdir}/sdb-prestart.service
-%{_unitdir}/basic.target.wants/sdb-prestart.service
-%endif
-%endif
-%if %{?TIZEN_FEATURE_USBHOST_TEST} == on
-%{_sysconfdir}/deviced/usb-host-test/test_gadget.gs
-%{_bindir}/usb-host-ffs-test-daemon
-%{_unitdir}/usb-host-ffs-test-daemon.service
-%{_unitdir}/usb-host-test.socket
-%{_sysconfdir}/deviced/usb-host-test/descs
-%{_sysconfdir}/deviced/usb-host-test/strs
-%endif
-
-%if %{?usbhost_module} == on
-%{_prefix}/lib/udev/rules.d/99-usbhost.rules
-%endif
%files -n %{libdaemon_name}
%manifest %{libdaemon_name}.manifest
+++ /dev/null
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(usb-host-ffs-test-daemon C)
-
-SET(SRCS
- usb-host-ffs-test-daemon.c
-)
-
-SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer -finstrument-functions")
-INCLUDE(FindPkgConfig)
-pkg_check_modules(SYSTEMD REQUIRED libsystemd)
-FOREACH(flag ${SYSTEMD_CFLAGS})
- SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
-ENDFOREACH(flag)
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
-
-ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} ${SYSTEMD_LDFLAGS})
-
-ADD_EXECUTABLE(descs_gen descs_gen.c)
-ADD_CUSTOM_COMMAND(OUTPUT descs strs
- COMMAND ${CMAKE_CURRENT_BINARY_DIR}/descs_gen
- DEPENDS descs_gen)
-ADD_CUSTOM_TARGET(descriptors ALL DEPENDS descs strs)
-
-INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/descs DESTINATION /etc/deviced/usb-host-test)
-INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/strs DESTINATION /etc/deviced/usb-host-test)
-INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
+++ /dev/null
-#include <linux/usb/functionfs.h>
-#include <linux/usb/ch9.h>
-#include <stdio.h>
-#include <endian.h>
-
-/******************** Descriptors and Strings *******************************/
-
-#define MISSING_DESC_HEAD
-#ifdef MISSING_DESC_HEAD
-enum {
- FUNCTIONFS_DESCRIPTORS_MAGIC_V2 = 3,
-};
-
-enum functionfs_flags {
- FUNCTIONFS_HAS_FS_DESC = 1,
- FUNCTIONFS_HAS_HS_DESC = 2,
-};
-
-struct usb_functionfs_descs_head_v2 {
- __le32 magic;
- __le32 length;
- __le32 flags;
- /*
- * __le32 fs_count, hs_count, fs_count; must be included manually in
- * the structure taking flags into consideration.
- */
-} __attribute__((packed));
-#endif
-
-static const struct {
- struct usb_functionfs_descs_head header;
- struct {
- struct usb_interface_descriptor intf;
- struct usb_endpoint_descriptor_no_audio bulk_in;
- struct usb_endpoint_descriptor_no_audio bulk_out;
- } __attribute__ ((__packed__)) fs_descs, hs_descs;
-} __attribute__ ((__packed__)) descriptors = {
- .header = {
- .magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC),
- .length = htole32(sizeof(descriptors)),
- .fs_count = htole32(3),
- .hs_count = htole32(3),
- },
- .fs_descs = {
- .intf = {
- .bLength = sizeof(descriptors.fs_descs.intf),
- .bDescriptorType = USB_DT_INTERFACE,
- .bNumEndpoints = 2,
- .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
- .iInterface = 1,
- },
- .bulk_in = {
- .bLength = sizeof(descriptors.fs_descs.bulk_in),
- .bDescriptorType = USB_DT_ENDPOINT,
- .bEndpointAddress = 1 | USB_DIR_IN,
- .bmAttributes = USB_ENDPOINT_XFER_BULK,
- },
- .bulk_out = {
- .bLength = sizeof(descriptors.fs_descs.bulk_out),
- .bDescriptorType = USB_DT_ENDPOINT,
- .bEndpointAddress = 2 | USB_DIR_OUT,
- .bmAttributes = USB_ENDPOINT_XFER_BULK,
- },
- },
- .hs_descs = {
- .intf = {
- .bLength = sizeof(descriptors.hs_descs.intf),
- .bDescriptorType = USB_DT_INTERFACE,
- .bNumEndpoints = 2,
- .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
- .iInterface = 1,
- },
- .bulk_in = {
- .bLength = sizeof(descriptors.hs_descs.bulk_in),
- .bDescriptorType = USB_DT_ENDPOINT,
- .bEndpointAddress = 1 | USB_DIR_IN,
- .bmAttributes = USB_ENDPOINT_XFER_BULK,
- .wMaxPacketSize = htole16(512),
- },
- .bulk_out = {
- .bLength = sizeof(descriptors.hs_descs.bulk_out),
- .bDescriptorType = USB_DT_ENDPOINT,
- .bEndpointAddress = 2 | USB_DIR_OUT,
- .bmAttributes = USB_ENDPOINT_XFER_BULK,
- .wMaxPacketSize = htole16(512),
- },
- },
-};
-
-#define STR_INTERFACE "loop input to output"
-
-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 = htole32(FUNCTIONFS_STRINGS_MAGIC),
- .length = htole32(sizeof(strings)),
- .str_count = htole32(1),
- .lang_count = htole32(1),
- },
- .lang0 = {
- htole16(0x0409), /* en-us */
- STR_INTERFACE,
- },
-};
-
-int main()
-{
- int ret;
- FILE *sfp, *dfp;
-
- dfp = fopen("descs", "w");
- if (!dfp) {
- perror("Could not open descritptors file");
- return -1;
- }
-
- sfp = fopen("strs", "w");
- if (!sfp) {
- perror("Could not open strings file");
- return -1;
- }
-
- ret = fwrite(&descriptors, sizeof(descriptors), 1, dfp);
- if (ret < 0) {
- perror("Could not write descriptors");
- goto out;
- }
-
- ret = fwrite(&strings, sizeof(strings), 1, sfp);
- if (ret < 0) {
- perror("Could not write strings");
- goto out;
- }
-
- ret = 0;
-
-out:
- fclose(sfp);
- fclose(dfp);
-
- return ret;
-}
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2016 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 <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <malloc.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <poll.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/eventfd.h>
-
-#include <linux/usb/functionfs.h>
-#include <systemd/sd-daemon.h>
-
-#define FFS_PATH "/tmp/usb-host-test-ffs"
-
-#define EP_IN_IDX 1
-#define EP_OUT_IDX 2
-
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-
-#define report_error(...) do { \
- fprintf(stderr, __VA_ARGS__); \
- putchar('\n'); \
- } while (0)
-
-char buf[512];
-
-/* Close all ep files */
-void cleanup_ffs(int *ep)
-{
- int i;
-
- for (i = 0; i < 3; ++i)
- close(ep[i]);
-}
-
-/* Handle events generated by kernel and provided via ep0 */
-int handle_ep0(int ep0, int *connected)
-{
- struct usb_functionfs_event event;
- int ret;
-
- ret = read(ep0, &event, sizeof(event));
- if (!ret) {
- report_error("unable to read event from ep0");
- return -EIO;
- }
-
- switch (event.type) {
- case FUNCTIONFS_SETUP:
- /* stall for all setuo requests */
- if (event.u.setup.bRequestType & USB_DIR_IN) {
- if (write(ep0, NULL, 0) < 0)
- report_error("write error %d", errno);
- } else {
- if (read(ep0, NULL, 0) < 0)
- report_error("read error %d", errno);
- }
- break;
-
- case FUNCTIONFS_ENABLE:
- *connected = 1;
- break;
-
- case FUNCTIONFS_DISABLE:
- *connected = 0;
- break;
-
- default:
- break;
- }
-
- return 0;
-}
-
-/* main chat function */
-void do_chat(int *ep)
-{
- int connected = 0;
- int ret;
-
- while (1) {
- while (!connected) {
- ret = handle_ep0(ep[0], &connected);
- if (ret < 0)
- return;
- }
- while (connected) {
- ret = read(ep[EP_OUT_IDX], buf, sizeof(buf));
- if (ret < 0) {
- if (ret == -ECONNRESET) {
- printf("Connection lost.");
- break;
- }
- return;
- }
-
- ret = write(ep[EP_IN_IDX], buf, ret);
- if (ret < 0) {
- if (ret == -ECONNRESET) {
- printf("Connection lost.");
- break;
- }
- return;
- }
-
- }
-
- }
-}
-
-int main(int argc, char **argv)
-{
- int ep[3];
- int i = 0;
-
- if (sd_listen_fds(0) < 3) {
- fprintf(stderr, "Expected endpoints not retrieved\n");
- return -1;
- }
-
- for (i = 0; i < 3; ++i)
- ep[i] = SD_LISTEN_FDS_START + i;
-
- do_chat(ep);
- cleanup_ffs(ep);
-
- return 0;
-}
+++ /dev/null
-attrs :
-{
- bcdUSB = 0x200;
- bDeviceClass = 0x0;
- bDeviceSubClass = 0x0;
- bDeviceProtocol = 0x0;
- bMaxPacketSize0 = 0x40;
- idVendor = 0x1D6B;
- idProduct = 0x104;
- bcdDevice = 0x1;
-};
-strings = (
- {
- lang = 0x409;
- manufacturer = "Foo Inc.";
- product = "Bar Gadget";
- serialnumber = "0123456789";
- } );
-functions :
-{
- ffs_instance1 :
- {
- instance = "usb-host-test";
- type = "ffs";
- attrs :
- {
- };
- };
-};
-configs = (
- {
- id = 1;
- name = "The only one";
- attrs :
- {
- bmAttributes = 0x80;
- bMaxPower = 0x2;
- };
- strings = (
- {
- lang = 0x409;
- configuration = "usb host API test config";
- } );
- functions = (
- {
- name = "some_name_here";
- function = "ffs_instance1";
- });
- } );
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2016 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 <libkmod.h>
-#include <usbg/usbg.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/mount.h>
-#include <unistd.h>
-
-#include "core/log.h"
-#include "core/config-parser.h"
-#include "core/device-idler.h"
-#include "core/device-notifier.h"
-#include "core/devices.h"
-#include "core/edbus-handler.h"
-#include "core/list.h"
-#include "shared/deviced-systemd.h"
-
-#define FFS_PATH "/run/usb-host-test-ffs"
-#define GADGET_SCHEME_PATH "/etc/deviced/usb-host-test/test_gadget.gs"
-#define FFS_INSTANCE_NAME "usb-host-test"
-#define GADGET_NAME "g1"
-#define SYSTEMD_UNIT_NAME "usb-host-test.socket"
-#define SYSTEMD_SERVICE_NAME "usb-host-ffs-test-daemon.service"
-#define UDC_NAME "dummy_udc.0"
-#define CONFIGFS_PATH "/sys/kernel/config/"
-
-#define SYSTEMD_DBUS_PATH "/org/freedesktop/systemd1"
-#define JOB_MANAGER_INTERFACE "org.freedesktop.systemd1.Manager"
-#define JOB_REMOVED "JobRemoved"
-
-static E_DBus_Connection *reply_conn;
-static DBusMessage *reply;
-static int using_legacy = 0;
-
-static int load_module(const char *name, const char *options)
-{
- struct kmod_ctx *ctx;
- struct kmod_module *mod;
- const char *config = NULL;
- struct kmod_list *l, *list = NULL;
- int ret = 0;
- int n = 0;
-
- ctx = kmod_new(NULL, &config);
- if (!ctx)
- return -1;
-
- ret = kmod_module_new_from_lookup(ctx, name, &list);
- if (ret < 0) {
- _E("Module %s lookup error", name);
- goto out;
- }
-
- kmod_list_foreach(l, list) {
- mod = kmod_module_get_module(l);
- if (!mod) {
- _E("Module %s load error", name);
- ret = -1;
- goto out;
- }
-
- ret = kmod_module_get_initstate(mod);
- if (ret >= 0) {
- _I("module %s already loaded", name);
- goto out; /* already loaded */
- }
-
- ret = kmod_module_insert_module(mod, 0, options);
- if (ret < 0) {
- _E("Module %s insert error", name);
- goto out;
- }
-
- ++n;
- }
-
- if (n == 0) {
- _E("Module %s not found", name);
- ret = -1;
- goto out;
- }
-
- _I("Module %s loaded\n", name);
- ret = 0;
-
-out:
- kmod_module_unref_list(list);
- kmod_unref(ctx);
- return ret;
-}
-
-static int unload_module(const char *name)
-{
- struct kmod_ctx *ctx;
- struct kmod_module *mod;
- const char *config = NULL;
- struct kmod_list *l, *list = NULL;
- int ret = 0;
- int n = 0;
-
- ctx = kmod_new(NULL, &config);
- if (!ctx)
- return -1;
-
- ret = kmod_module_new_from_lookup(ctx, name, &list);
- if (ret < 0) {
- _E("Module %s lookup error", name);
- goto out;
- }
-
- kmod_list_foreach(l, list) {
- mod = kmod_module_get_module(l);
- if (!mod) {
- _E("Module %s unload error", name);
- ret = -1;
- goto out;
- }
-
- ret = kmod_module_get_initstate(mod);
- if (ret < 0)
- goto out; /* not loaded */
-
- ret = kmod_module_remove_module(mod, 0);
- if (ret < 0) {
- _E("Module %s remove error", name);
- goto out;
- }
-
- ++n;
- }
-
- if (n == 0) {
- _I("Module %s not found", name);
- ret = -1;
- goto out;
- }
-
- _I("Module %s unloaded\n", name);
- ret = 0;
-
-out:
- kmod_module_unref_list(list);
- kmod_unref(ctx);
- return ret;
-}
-
-static int load_gadget()
-{
- usbg_state *s;
- int ret = 0;
- FILE *fp;
-
- ret = usbg_init(CONFIGFS_PATH, &s);
- if (ret < 0) {
- _E("could not init libusbg");
- return ret;
- }
-
- fp = fopen(GADGET_SCHEME_PATH, "r");
- if (!fp) {
- _E("could not open gadget scheme");
- ret = -1;
- goto out;
- }
-
- ret = usbg_import_gadget(s, fp, GADGET_NAME, NULL);
- if (ret < 0) {
- _E("could not import gadget");
- goto out;
- }
-
-out:
- usbg_cleanup(s);
- return ret;
-}
-
-int enable_gadget()
-{
- int ret;
- usbg_gadget *g;
- usbg_udc *udc;
- usbg_state *s;
-
- if (using_legacy)
- return 0;
-
- ret = usbg_init(CONFIGFS_PATH, &s);
- if (ret < 0)
- return ret;
-
- g = usbg_get_gadget(s, GADGET_NAME);
- if (!g) {
- _E("could not find gadget");
- ret = -1;
- goto out;
- }
-
- udc = usbg_get_udc(s, UDC_NAME);
- if (!udc) {
- _E("could not find udc");
- ret = -1;
- goto out;
- }
-
- ret = usbg_enable_gadget(g, udc);
-
-out:
- usbg_cleanup(s);
- return ret;
-}
-
-static void service_started_handler(void *data, DBusMessage *msg)
-{
- DBusError err;
- uint32_t id;
- const char *path, *unit, *result;
- int ret;
-
- dbus_error_init(&err);
- if (!dbus_message_get_args(msg, &err, DBUS_TYPE_UINT32, &id,
- DBUS_TYPE_OBJECT_PATH, &path,
- DBUS_TYPE_STRING, &unit,
- DBUS_TYPE_STRING, &result,
- DBUS_TYPE_INVALID)) {
- _E("%s", err.message);
- return;
- }
-
- if (strcmp(unit, SYSTEMD_UNIT_NAME) == 0) {
- ret = enable_gadget();
- if (ret < 0)
- _E("Could not enable gadget");
- else
- _I("Start");
-
- unregister_edbus_signal_handler(SYSTEMD_DBUS_PATH,
- JOB_MANAGER_INTERFACE, JOB_REMOVED);
-
-
- e_dbus_message_send(reply_conn, reply, NULL, 0, NULL);
- }
-}
-
-static void service_stopped_handler(void *data, DBusMessage *msg)
-{
- DBusError err;
- uint32_t id;
- const char *path, *unit, *result;
- int ret;
- usbg_state *s;
- usbg_gadget *g;
-
- dbus_error_init(&err);
- if (!dbus_message_get_args(msg, &err, DBUS_TYPE_UINT32, &id,
- DBUS_TYPE_OBJECT_PATH, &path,
- DBUS_TYPE_STRING, &unit,
- DBUS_TYPE_STRING, &result,
- DBUS_TYPE_INVALID)) {
- _E("%s", err.message);
- return;
- }
-
- if (strcmp(unit, SYSTEMD_SERVICE_NAME) == 0) {
- ret = umount(FFS_PATH);
- if (ret < 0) {
- _E("could not umount functionfs");
- goto out1;
- }
-
- if (!using_legacy) {
- ret = usbg_init(CONFIGFS_PATH, &s);
- if (ret < 0) {
- _E("could not init libusbg");
- goto out1;
- }
-
- g = usbg_get_gadget(s, GADGET_NAME);
- if (!g) {
- _E("could not find gadget");
- ret = -1;
- goto out;
- }
-
- ret = usbg_rm_gadget(g, USBG_RM_RECURSE);
- if (ret < 0) {
- _E("could not remove gadget");
- goto out;
- }
- }
-
- ret = unload_module("dummy_hcd");
- if (ret < 0) {
- _E("Error unloading module: %d", ret);
- goto out1;
- }
-
- if (using_legacy) {
- ret = unload_module("g_ffs");
- if (ret < 0) {
- _E("Error unloading module: %d", ret);
- goto out1;
- }
- } else {
- ret = unload_module("usb_f_fs");
- if (ret < 0) {
- _E("Error unloading module: %d", ret);
- goto out;
- }
- }
-
-
- _I("stop");
-
-out:
- if (!using_legacy)
- usbg_cleanup(s);
-out1:
- e_dbus_message_send(reply_conn, reply, NULL, 0, NULL);
- unregister_edbus_signal_handler(SYSTEMD_DBUS_PATH,
- JOB_MANAGER_INTERFACE, JOB_REMOVED);
- }
-}
-
-int start()
-{
- struct stat st;
- int ret;
-
- ret = load_module("dummy_hcd", NULL);
- if (ret < 0) {
- _E("Error loading module: %d", ret);
- return ret;
- }
-
- /* If you need to setup vid, pid or other data use module parameters */
- ret = load_module("g_ffs",
- "idVendor=0x1D6B"
- " idProduct=0x104"
- " bcdDevice=0x0001"
- " iManufacturer=\"Foo Inc.\""
- " iProduct=\"Bar Gadget\""
- " iSerialNumber=\"0123456789\""
- " generic_ffs_config_str=\"usb host API test config\""
- " bmAttrs_overwrite=\"0x80\"");
- if (ret < 0) {
- using_legacy = 0;
- _I("Legacy gadget g_ffs not found. Using ConfigFS.");
-
- ret = load_module("usb_f_fs", NULL);
- if (ret < 0) {
- _E("Error loading module: %d", ret);
- return ret;
- }
-
- ret = load_gadget();
- if (ret < 0) {
- _E("Error loading gadget: %d", ret);
- goto out;
- }
- } else {
- using_legacy = 1;
- }
-
- /* TODO make it recusrsive? */
- if (stat(FFS_PATH, &st) < 0) {
- ret = mkdir(FFS_PATH, S_IRWXU | S_IRWXG | S_IROTH);
- if (ret < 0) {
- _E("Error creating ffs directory");
- goto out;
- }
- }
-
- ret = mount(FFS_INSTANCE_NAME, FFS_PATH, "functionfs", 0, NULL);
- if (ret < 0) {
- _E("Error mounting ffs");
- goto out;
- }
-
- ret = register_edbus_signal_handler(SYSTEMD_DBUS_PATH,
- JOB_MANAGER_INTERFACE, JOB_REMOVED,
- service_started_handler);
- if (ret < 0) {
- _E("could not register signal handler");
- goto out;
- }
-
- ret = deviced_systemd_start_unit(SYSTEMD_UNIT_NAME);
- if (ret < 0) {
- _E("Error starting daemon");
- unregister_edbus_signal_handler(SYSTEMD_DBUS_PATH,
- JOB_MANAGER_INTERFACE, JOB_REMOVED);
- goto out;
- }
-
- return 0;
-
-out:
-
-/* It's already a crash, thus we ignore return values here */
-
- unload_module("dummy_hcd");
- unload_module("usb_f_fs");
- if (using_legacy)
- unload_module("g_ffs");
-
- unregister_edbus_signal_handler(SYSTEMD_DBUS_PATH,
- JOB_MANAGER_INTERFACE, JOB_REMOVED);
-
- return ret;
-}
-
-static int stop()
-{
- int ret = 0;
-
- ret = register_edbus_signal_handler(SYSTEMD_DBUS_PATH,
- JOB_MANAGER_INTERFACE, JOB_REMOVED,
- service_stopped_handler);
- if (ret < 0) {
- _E("could not register signal handler");
- return ret;
- }
-
- ret = deviced_systemd_stop_unit(SYSTEMD_UNIT_NAME);
- if (ret < 0) {
- _E("could not stop socket unit");
- goto out;
- }
-
- ret = deviced_systemd_stop_unit(SYSTEMD_SERVICE_NAME);
- if (ret < 0) {
- _E("could not stop service unit");
- goto out;
- }
-
- return ret;
-
-out:
- unregister_edbus_signal_handler(SYSTEMD_DBUS_PATH,
- JOB_MANAGER_INTERFACE, JOB_REMOVED);
- return ret;
-}
-
-static DBusMessage *edbus_start(E_DBus_Object *obj, DBusMessage *msg)
-{
- int ret;
-
- reply_conn = e_dbus_object_conn_get(obj);
- reply = dbus_message_new_method_return(msg);
-
- ret = start();
- if (ret < 0)
- return reply;
-
- return NULL;
-}
-
-static DBusMessage *edbus_stop(E_DBus_Object *obj, DBusMessage *msg)
-{
- int ret;
-
- reply_conn = e_dbus_object_conn_get(obj);
- reply = dbus_message_new_method_return(msg);
-
- ret = stop();
- if (ret < 0)
- return dbus_message_new_method_return(msg);
-
- return NULL;
-}
-
-static int usb_host_test_start(enum device_flags flags)
-{
- return start();
-}
-
-static int usb_host_test_stop(enum device_flags flags)
-{
- return stop();
-}
-
-static const struct edbus_method edbus_methods[] = {
- { "start", NULL, NULL, edbus_start }, /* for devicectl */
- { "stop", NULL, NULL, edbus_stop }, /* for devicectl */
-};
-
-static void usb_host_test_init(void *data)
-{
- int ret;
-
- ret = register_edbus_interface_and_method(DEVICED_PATH_USB_HOST_TEST,
- DEVICED_INTERFACE_USB_HOST_TEST,
- edbus_methods, ARRAY_SIZE(edbus_methods));
-
- if (ret < 0) {
- _E("Failed to register edbus method! %d", ret);
- return;
- }
-
- _I("initialized");
-}
-
-static void usb_host_test_exit(void *data)
-{
- _I("exited");
-}
-
-static const struct device_ops usb_host_test_device_ops = {
- .name = "usb-host-test",
- .init = usb_host_test_init,
- .exit = usb_host_test_exit,
- .start = usb_host_test_start,
- .stop = usb_host_test_stop,
-};
-
-DEVICE_OPS_REGISTER(&usb_host_test_device_ops)
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2016 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 <error.h>
-#include <stdbool.h>
-#include <device-node.h>
-#include <vconf.h>
-
-#include "core/log.h"
-#include "core/common.h"
-#include "core/devices.h"
-#include "core/edbus-handler.h"
-#include "shared/dbus.h"
-#include "usb.h"
-
-/* Legacy signals */
-#define SIGNAL_STATE_CHANGED "StateChanged"
-#define SIGNAL_MODE_CHANGED "ModeChanged"
-#define SIGNAL_CONFIG_ENABLED "ConfigEnabled"
-#define CHANGE_USB_MODE "ChangeUsbMode"
-
-static int get_usb_current_mode(void)
-{
- int val, ret;
-
- ret = vconf_get_int(VCONFKEY_USB_CUR_MODE, &val);
- if (ret != 0) {
- _E("Failed to get current mode (%d)", ret);
- return ret;
- }
-
- return val;
-}
-
-static int get_usb_state(void)
-{
- int ret, val;
- int result = 0;
-
- ret = vconf_get_int(VCONFKEY_SYSMAN_USB_STATUS, &val);
- if (ret != 0) {
- _E("Failed to get usb_state (%d)", ret);
- return ret;
- }
-
- if (val == VCONFKEY_SYSMAN_USB_DISCONNECTED)
- result = val;
- else {
- result = VCONFKEY_SYSMAN_USB_CONNECTED;
- if (val == VCONFKEY_SYSMAN_USB_AVAILABLE)
- result |= VCONFKEY_SYSMAN_USB_AVAILABLE;
- }
-
- return result;
-}
-
-/* dbus signals */
-void broadcast_usb_config_enabled(int state)
-{
- int ret;
- char *param[1];
- char buf[2];
-
- snprintf(buf, sizeof(buf), "%d", state);
- param[0] = buf;
-
- _I("USB config enabled (%d)", state);
-
- ret = broadcast_edbus_signal(DEVICED_PATH_USB,
- DEVICED_INTERFACE_USB, SIGNAL_CONFIG_ENABLED,
- "i", param);
- if (ret < 0)
- _E("Failed to send dbus signal");
-}
-
-void broadcast_usb_state_changed(void)
-{
- int ret;
- char *param[1];
- char text[16];
- unsigned int state;
- static unsigned int prev_state = UINT_MAX;
-
- state = get_usb_state();
- if (state == prev_state)
- return;
- prev_state = state;
-
- _I("USB state changed (%u)", state);
-
- snprintf(text, sizeof(text), "%u", state);
- param[0] = text;
-
- ret = broadcast_edbus_signal(DEVICED_PATH_USB,
- DEVICED_INTERFACE_USB, SIGNAL_STATE_CHANGED,
- "u", param);
- if (ret < 0)
- _E("Failed to send dbus signal");
-}
-
-void broadcast_usb_mode_changed(void)
-{
- int ret;
- char *param[1];
- char text[16];
- unsigned int mode;
- static unsigned int prev_mode = UINT_MAX;
-
- mode = get_usb_current_mode();
- if (mode == prev_mode)
- return;
- prev_mode = mode;
-
- snprintf(text, sizeof(text), "%u", mode);
- param[0] = text;
-
- _I("USB mode changed (%u)", mode);
-
- ret = broadcast_edbus_signal(DEVICED_PATH_USB,
- DEVICED_INTERFACE_USB, SIGNAL_MODE_CHANGED,
- "u", param);
- if (ret < 0)
- _E("Failed to send dbus signal");
-}
-
-static void change_usb_client_mode(void *data, DBusMessage *msg)
-{
- DBusError err;
- int req, debug;
- int ret;
- unsigned mode;
-
- if (dbus_message_is_signal(msg, DEVICED_INTERFACE_USB, CHANGE_USB_MODE) == 0)
- return;
-
- dbus_error_init(&err);
-
- if (dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &req, DBUS_TYPE_INVALID) == 0) {
- _E("FAIL: dbus_message_get_args");
- goto out;
- }
-
- debug = 0;
- switch (req) {
- case SET_USB_DEFAULT:
- case SET_USB_SDB:
- case SET_USB_SDB_DIAG:
- mode = USB_FUNCTION_MTP | USB_FUNCTION_ACM | USB_FUNCTION_SDB;
- debug = 1;
- break;
- case SET_USB_RNDIS:
- case SET_USB_RNDIS_DIAG:
- case SET_USB_RNDIS_SDB:
- mode = USB_FUNCTION_RNDIS | USB_FUNCTION_SDB;
- debug = 1;
- break;
- case 11: /* SET_USB_DIAG_RMNET */
- case 12: /* SET_USB_ACM_SDB_DM */
- default:
- _E("(%d) is unknown usb mode", req);
- goto out;
- }
-
- if (vconf_set_bool(VCONFKEY_SETAPPL_USB_DEBUG_MODE_BOOL, debug) != 0)
- _E("Failed to set usb debug toggle (%d)", debug);
-
- ret = usb_change_mode(mode);
- if (ret < 0)
- _E("Failed to change usb mode (%d)", ret);
-
-out:
- dbus_error_free(&err);
-}
-
-/* dbus methods */
-static DBusMessage *get_usb_client_state(E_DBus_Object *obj, DBusMessage *msg)
-{
- DBusMessageIter iter;
- DBusMessage *reply;
- unsigned int state;
-
- state = get_usb_state();
-
- reply = dbus_message_new_method_return(msg);
- dbus_message_iter_init_append(reply, &iter);
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &state);
- return reply;
-}
-
-static DBusMessage *get_usb_client_mode(E_DBus_Object *obj, DBusMessage *msg)
-{
- DBusMessageIter iter;
- DBusMessage *reply;
- unsigned int mode;
-
- mode = get_usb_current_mode();
-
- reply = dbus_message_new_method_return(msg);
- dbus_message_iter_init_append(reply, &iter);
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &mode);
- return reply;
-}
-
-static const struct edbus_method edbus_methods[] = {
- { "GetState", NULL, "u", get_usb_client_state }, /* from Tizen 2.3 */
- { "GetMode", NULL, "u", get_usb_client_mode }, /* from Tizen 2.3 */
- /* Add methods here */
-};
-
-int usb_dbus_init(void)
-{
- int ret;
-
- ret = register_edbus_method(DEVICED_PATH_USB,
- edbus_methods, ARRAY_SIZE(edbus_methods));
- if (ret < 0) {
- _E("Failed to register dbus method (%d)", ret);
- return ret;
- }
-
- ret = register_edbus_signal_handler(DEVICED_PATH_USB,
- DEVICED_INTERFACE_USB, "ChangeUsbMode",
- change_usb_client_mode);
- if (ret < 0) {
- _E("Failed to registser dbus signal (%d)", ret);
- return ret;
- }
-
- return 0;
-}
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2015 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 <stdio.h>
-#include <string.h>
-#include <stddef.h>
-
-#include "core/log.h"
-#include "core/common.h"
-#include "core/config-parser.h"
-#include "core/launch.h"
-#include "shared/deviced-systemd.h"
-#include "usb.h"
-
-#define USB_OPERATION "/etc/deviced/usb-operation.conf"
-
-#define KEY_START_STR "Start"
-#define KEY_STOP_STR "Stop"
-
-#define BUF_MAX 128
-
-typedef enum {
- OPERATION_STOP,
- OPERATION_START,
-} operation_e;
-
-struct oper_data {
- char mode_str[BUF_MAX];
- operation_e type;
-};
-
-static int load_operation_config(struct parse_result *result, void *user_data)
-{
- struct oper_data *data = user_data;
- int ret;
- operation_e type;
-
- if (!data || !result)
- return -EINVAL;
-
- if (!strstr(data->mode_str, result->section))
- return 0;
-
- if (!strncmp(result->name, KEY_START_STR, strlen(KEY_START_STR)))
- type = OPERATION_START;
- else if (!strncmp(result->name, KEY_STOP_STR, strlen(KEY_STOP_STR)))
- type = OPERATION_STOP;
- else {
- _E("Invalid name (%s)", result->name);
- return -EINVAL;
- }
-
- if (type != data->type)
- return 0;
-
- if (strstr(result->name, "Service")) {
- if (type == OPERATION_START)
- ret = deviced_systemd_start_unit(result->value);
- if (type == OPERATION_STOP)
- ret = deviced_systemd_stop_unit(result->value);
- } else
- ret = launch_app_cmd(result->value);
-
- _I("Execute(%s %s: %d)", result->name, result->value, ret);
-
- return 0;
-}
-
-static int usb_execute_operation(unsigned int mode, operation_e type)
-{
- int ret;
- struct oper_data data;
-
- if (mode == USB_FUNCTION_NONE)
- return -EINVAL;
-
- usb_state_get_mode_str(mode, data.mode_str, sizeof(data.mode_str));
-
- data.type = type;
-
- ret = config_parse(USB_OPERATION,
- load_operation_config, &data);
- if (ret < 0)
- _E("Failed to load usb operation (%d)", ret);
-
- return ret;
-}
-
-int usb_operation_start(unsigned int mode)
-{
- return usb_execute_operation(mode, OPERATION_START);
-}
-
-int usb_operation_stop(unsigned int mode)
-{
- return usb_execute_operation(mode, OPERATION_STOP);
-}
+++ /dev/null
-[sdb]
-StartService=sdbd.service
-StopService=sdbd.service
-
-
-[mtp]
-StartService=mtp-responder.service
-StopService=mtp-responder.service
-
-[rndis]
-Start=/sbin/ifconfig usb0 192.168.129.3 up
-Start=/sbin/route add -net 192.168.129.0 netmask 255.255.255.0 dev usb0
-StartService=sshd.service
-StartService=sdbd.service
-StopService=sshd.service
-Stop=/sbin/ifconfig usb0 down
-StopService=sdbd.service
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2016 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 <stdio.h>
-#include <stdbool.h>
-#include <vconf.h>
-#include <bundle.h>
-#include <eventsystem.h>
-
-#include "core/log.h"
-#include "core/list.h"
-#include "core/common.h"
-#include "core/device-notifier.h"
-#include "display/poll.h"
-#include "extcon/extcon.h"
-#include "apps/apps.h"
-#include "usb.h"
-#include "usb-tethering.h"
-
-static usb_connection_state_e usb_connection = USB_DISCONNECTED;
-static unsigned int usb_mode = USB_FUNCTION_NONE;
-static unsigned int usb_selected_mode = USB_FUNCTION_SDB; /* for debugging */
-
-static void usb_state_send_system_event(int status)
-{
- bundle *b;
- const char *str;
-
- switch (status) {
- case VCONFKEY_SYSMAN_USB_DISCONNECTED:
- str = EVT_VAL_USB_DISCONNECTED;
- break;
- case VCONFKEY_SYSMAN_USB_CONNECTED:
- str = EVT_VAL_USB_CONNECTED;
- break;
- case VCONFKEY_SYSMAN_USB_AVAILABLE:
- str = EVT_VAL_USB_AVAILABLE;
- break;
- default:
- return;
- }
-
- _I("system_event (%s)", str);
-
- b = bundle_create();
- bundle_add_str(b, EVT_KEY_USB_STATUS, str);
- eventsystem_send_system_event(SYS_EVENT_USB_STATUS, b);
- bundle_free(b);
-}
-
-static void usb_state_set_connection(usb_connection_state_e conn)
-{
- usb_connection = conn;
-}
-
-usb_connection_state_e usb_state_get_connection(void)
-{
- return usb_connection;
-}
-
-void usb_state_retrieve_selected_mode(void)
-{
- int ret, mode;
- ret = vconf_get_int(VCONFKEY_USB_SEL_MODE, &mode);
- if (ret != 0) {
- _E("Failed to retrieve selected mode");
- return;
- }
-
-#ifdef ENGINEER_MODE
- if (!(mode & USB_FUNCTION_SDB)) {
- mode = USB_FUNCTION_MTP | USB_FUNCTION_ACM | USB_FUNCTION_SDB;
- usb_state_set_selected_mode(mode);
- }
-#endif
-
- usb_selected_mode = (unsigned int)mode;
-}
-
-void usb_state_set_selected_mode(unsigned int mode)
-{
- usb_selected_mode = mode;
- vconf_set_int(VCONFKEY_USB_SEL_MODE, mode);
-}
-
-unsigned int usb_state_get_current_mode(void)
-{
- return usb_mode;
-}
-
-unsigned int usb_state_get_selected_mode(void)
-{
- return usb_selected_mode;
-}
-
-char *usb_state_get_mode_str(unsigned int mode, char *str, size_t len)
-{
- int i;
- int ret;
-
- if (mode == USB_FUNCTION_NONE) {
- snprintf(str, len, "%s", "");
- } else {
- for (i = 0; i < ARRAY_SIZE(_available_funcs); ++i) {
- if (mode & _available_funcs[i]->id) {
- ret = snprintf(str, len, "%s,",
- _available_funcs[i]->name);
- if (ret >= len)
- return str;
- str += ret;
- len -= ret;
- }
- }
- }
-
- /* eliminate trailing comma */
- *(str - 1) = '\0';
- return str;
-}
-
-void usb_state_update_state(usb_connection_state_e state, unsigned int mode)
-{
- static int old_mode = -1; /* VCONFKEY_USB_CUR_MODE */
- static int old_status = -1; /* VCONFKEY_SYSMAN_USB_STATUS */
- static int noti_id = -1;
- int status;
-
- if (state == USB_DISCONNECTED && mode != USB_FUNCTION_NONE)
- mode = USB_FUNCTION_NONE;
-
- if (mode == USB_FUNCTION_NONE) {
- if (noti_id >= 0) {
- remove_notification("MediaDeviceNotiOff", noti_id);
- noti_id = -1;
- }
- } else if (mode | USB_FUNCTION_MTP) {
- if (noti_id < 0)
- noti_id = add_notification("MediaDeviceNotiOn");
- if (noti_id < 0)
- _E("Failed to show notification for usb connection");
- }
-
- usb_state_set_connection(state);
- if (state == USB_CONNECTED) {
- if (mode == USB_FUNCTION_NONE)
- status = VCONFKEY_SYSMAN_USB_CONNECTED;
- else
- status = VCONFKEY_SYSMAN_USB_AVAILABLE;
- } else
- status = VCONFKEY_SYSMAN_USB_DISCONNECTED;
-
- if (old_status != status) {
- usb_state_send_system_event(status);
- vconf_set_int(VCONFKEY_SYSMAN_USB_STATUS, status);
- old_status = status;
- }
-
- if (old_mode != mode) {
- vconf_set_int(VCONFKEY_USB_CUR_MODE, mode);
- usb_mode = mode;
- old_mode = mode;
- }
-}
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2016 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 <stdio.h>
-#include <string.h>
-#include <vconf.h>
-
-#include "core/log.h"
-#include "core/common.h"
-#include "core/config-parser.h"
-#include "core/launch.h"
-#include "core/device-notifier.h"
-#include "usb.h"
-
-static bool tethering_state;
-
-bool usb_tethering_state(void)
-{
- return tethering_state;
-}
-
-static void usb_tethering_changed(keynode_t *key, void *data)
-{
- int mode;
- bool curr;
-
- if (!key)
- return;
-
- mode = vconf_keynode_get_int(key);
- curr = mode & VCONFKEY_MOBILE_HOTSPOT_MODE_USB;
-
- if (curr == tethering_state)
- return;
-
- tethering_state = curr;
-
- device_notify(DEVICE_NOTIFIER_USB_TETHERING_MODE, (void *)curr);
-}
-
-static int usb_tethering_mode_changed(void *data)
-{
- bool on;
- unsigned mode;
- int ret;
-
- on = (bool)data;
-
- /*
- * TODO.
- * Preserve gadget mode when tethering is being turned on
- * and restore it later when tethering is being turned off/
- */
- if (on)
- mode = USB_FUNCTION_RNDIS | USB_FUNCTION_SDB;
- else
- mode = USB_FUNCTION_MTP | USB_FUNCTION_ACM | USB_FUNCTION_SDB;
-
- ret = usb_change_mode(mode);
- if (ret < 0)
- _E("Failed to change usb mode to (%s)", mode);
-
- return ret;
-}
-
-void add_usb_tethering_handler(void)
-{
- if (vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE,
- usb_tethering_changed, NULL) != 0)
- _E("Failed to add usb tethering handler");
-
- register_notifier(DEVICE_NOTIFIER_USB_TETHERING_MODE,
- usb_tethering_mode_changed);
-}
-
-void remove_usb_tethering_handler(void)
-{
- vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE,
- usb_tethering_changed);
-
- unregister_notifier(DEVICE_NOTIFIER_USB_TETHERING_MODE,
- usb_tethering_mode_changed);
-}
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2016 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 __USB_TETHERING_H__
-#define __USB_TETHERING_H__
-
-#include <stdio.h>
-
-bool usb_tethering_state(void);
-
-void add_usb_tethering_handler(void);
-void remove_usb_tethering_handler(void);
-
-#endif /* __USB_TETHERING_H__ */
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2015 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 <stdio.h>
-#include <vconf.h>
-#include <bundle.h>
-#include <eventsystem.h>
-
-#include "core/log.h"
-#include "core/list.h"
-#include "core/common.h"
-#include "core/device-notifier.h"
-#include "display/poll.h"
-#include "extcon/extcon.h"
-#include "apps/apps.h"
-#include "usb.h"
-#include "usb-tethering.h"
-
-static struct usb_gadget_translator *gadget_translator;
-static struct usb_client *usb_client;
-static unsigned current_mode;
-
-struct extcon_ops extcon_usb_ops;
-
-static int usb_probe(void)
-{
- struct hw_info *info;
- struct hw_common *common;
- int ret;
-
- /* We need both HALs up and running for operating in USB client mode */
-
- if (!gadget_translator) {
- ret = hw_get_info(USB_GADGET_DEVICE_ID,
- (const struct hw_info **)&info);
- if (ret)
- goto no_gadget_hal;
-
- if (!info->open) {
- _E("Failed to open gadget translator; open(NULL)");
- /* TODO. Shouldn't we free somehow info structure? */
- return -ENODEV;
- }
-
- ret = info->open(info, NULL, &common);
- if (ret < 0) {
- _E("Failed to open usb gadget translator (%d)", ret);
- return ret;
- }
-
- gadget_translator = container_of(common,
- struct usb_gadget_translator,
- common);
- if (!gadget_translator->id_to_gadget ||
- !gadget_translator->cleanup_gadget) {
- _E("Invalid gadget translator HAL");
- goto invalid_translator_hal;
- }
- }
-
- if (!usb_client) {
- ret = hw_get_info(USB_CLIENT_HARDWARE_DEVICE_ID,
- (const struct hw_info **)&info);
- if (ret)
- goto no_client_hal;
-
- if (!info->open) {
- _E("Failed to open usb client hw; open(NULL)");
- /* TODO. Shouldn't we free somehow info structure? */
- return -ENODEV;
- }
-
- ret = info->open(info, NULL, &common);
- if (ret < 0) {
- _E("Failed to open usb client hw (%d)", ret);
- return ret;
- }
-
- usb_client = container_of(common, struct usb_client, common);
-
- if (!usb_client->reconfigure_gadget || !usb_client->enable ||
- !usb_client->disable)
- goto invalid_config_hal;
- }
-
- return 0;
-
-invalid_config_hal:
- if (usb_client->common.info->close)
- usb_client->common.info->close(&usb_client->common);
-
-no_client_hal:
-invalid_translator_hal:
- if (gadget_translator->common.info)
- gadget_translator->common.info->close(&gadget_translator->common);
- gadget_translator = NULL;
-no_gadget_hal:
- /* TODO. Maybe some default action here? */
- return -ENOENT;
-}
-
-static void usb_release()
-{
- if (usb_client)
- if (usb_client->common.info->close)
- usb_client->common.info->close(&usb_client->common);
-
- if (gadget_translator)
- if (gadget_translator->common.info->close)
- gadget_translator->common.info->close(
- &gadget_translator->common);
-}
-
-static int usb_config_init(void)
-{
- int ret;
- struct usb_gadget_id gadget_id;
- struct usb_gadget *gadget;
-
- if (!gadget_translator || !usb_client)
- goto no_hal;
-
- memset(&gadget_id, 0, sizeof(gadget_id));
-
- gadget_id.function_mask = usb_state_get_selected_mode();
- ret = gadget_translator->id_to_gadget(&gadget_id, &gadget);
- if (ret) {
- _E("Unable to translate id into gadget (%d)", ret);
- return ret;
- }
-
- usb_client->disable(usb_client);
- ret = usb_client->reconfigure_gadget(usb_client, gadget);
- gadget_translator->cleanup_gadget(gadget);
- if (ret)
- _E("Unable to configure gadget (%d)", ret);
-
- return ret;
-no_hal:
- /* TODO. Maybe some default action here? */
- return -ENODEV;
-}
-
-static void usb_config_deinit(void)
-{
- if (!usb_client)
- goto no_hal;
-
- usb_client->disable(usb_client);
-
- return;
-no_hal:
- /* TODO. Maybe some default action here? */
- return;
-}
-
-static int usb_config_enable(void)
-{
- if (!usb_client)
- goto no_hal;
-
- return usb_client->enable(usb_client);
-
-no_hal:
- /* TODO. Maybe some default action here? */
- return -ENODEV;
-}
-
-static int usb_config_disable(void)
-{
- if (!usb_client)
- goto no_hal;
-
- usb_client->disable(usb_client);
-
- return 0;
-no_hal:
- /* TODO. Maybe some default action here? */
- return -ENODEV;
-}
-
-int usb_change_mode(unsigned mode)
-{
- struct usb_gadget_id gadget_id;
- struct usb_gadget *gadget;
- int ret;
-
- if (!gadget_translator || !usb_client)
- goto no_hal;
-
- memset(&gadget_id, 0, sizeof(gadget_id));
- gadget_id.function_mask = mode;
-
- ret = gadget_translator->id_to_gadget(&gadget_id, &gadget);
- if (ret) {
- _E("Unable to translate id into gadget (%d)", ret);
- return ret;
- }
-
- usb_client->disable(usb_client);
- ret = usb_client->reconfigure_gadget(usb_client, gadget);
- gadget_translator->cleanup_gadget(gadget);
- if (ret) {
- _E("Unable to configure gadget (%d)", ret);
- goto out;
- }
-
- current_mode = mode;
-out:
- return ret;
-no_hal:
- /* TODO. Maybe some default action here? */
- return -ENODEV;
-}
-
-static int usb_state_changed(int status)
-{
- static int old = -1; /* to update at the first time */
- unsigned mode;
- int ret;
-
- _I("USB state is changed from (%d) to (%d)", old, status);
-
- if (old == status)
- return 0;
-
- switch (status) {
- case USB_CONNECTED:
- _I("USB cable is connected");
- usb_state_update_state(USB_CONNECTED, USB_FUNCTION_NONE);
- mode = usb_state_get_selected_mode();
- if (mode != current_mode)
- usb_change_mode(mode);
-
- ret = usb_config_enable();
- if (ret < 0) {
- _E("Failed to enable usb config (%d)", ret);
- break;
- }
- usb_operation_start(mode);
- usb_state_update_state(USB_CONNECTED, mode);
- pm_lock_internal(INTERNAL_LOCK_USB,
- LCD_OFF, STAY_CUR_STATE, 0);
- break;
- case USB_DISCONNECTED:
- _I("USB cable is disconnected");
- usb_operation_stop(usb_state_get_current_mode());
- usb_state_update_state(USB_DISCONNECTED, USB_FUNCTION_NONE);
-
- ret = usb_config_disable();
- if (ret != 0)
- _E("Failed to disable usb config (%d)", ret);
- pm_unlock_internal(INTERNAL_LOCK_USB,
- LCD_OFF, STAY_CUR_STATE);
- break;
- default:
- _E("Invalid USB state(%d)", status);
- return -EINVAL;
- }
- if (ret < 0)
- _E("Failed to operate usb connection(%d)", ret);
- else
- old = status;
-
- return ret;
-}
-
-static void usb_init(void *data)
-{
- int ret;
-
- ret = usb_probe();
- if (ret < 0) {
- _E("USB client cannot be used (%d)", ret);
- return;
- }
-
- usb_state_retrieve_selected_mode();
-
- ret = usb_config_init();
- if (ret < 0)
- _E("Failed to initialize usb configuation");
-
- ret = usb_dbus_init();
- if (ret < 0)
- _E("Failed to init dbus (%d)", ret);
-
- add_usb_tethering_handler();
-
- ret = usb_state_changed(extcon_usb_ops.status);
- if (ret < 0)
- _E("Failed to update usb status(%d)", ret);
-}
-
-static void usb_exit(void *data)
-{
- remove_usb_tethering_handler();
- usb_state_update_state(USB_DISCONNECTED, USB_FUNCTION_NONE);
- usb_config_deinit();
- usb_release();
-}
-
-struct extcon_ops extcon_usb_ops = {
- .name = EXTCON_CABLE_USB,
- .init = usb_init,
- .exit = usb_exit,
- .update = usb_state_changed,
-};
-
-EXTCON_OPS_REGISTER(extcon_usb_ops)
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2015 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 __DEVICED_USB_H__
-#define __DEVICED_USB_H__
-
-#include <hw/usb_gadget.h>
-#include <hw/usb_client.h>
-
-#define USB_CONFIG_OPS_REGISTER(dev) \
-static void __CONSTRUCTOR__ usb_config_init(void) \
-{ \
- add_usb_config(dev); \
-} \
-static void __DESTRUCTOR__ usb_config_exit(void) \
-{ \
- remove_usb_config(dev); \
-}
-
-struct usb_config_ops {
- bool (*is_valid)(void);
- const struct usb_config_plugin_ops *(*load)(void);
- void (*release)(void);
-};
-
-/* TODO
- * move it to proper location */
-struct usb_config_plugin_ops {
- int (*init)(char *name);
- void (*deinit)(char *name);
- int (*enable)(char *name);
- int (*disable)(char *name);
- int (*change)(char *name);
-};
-
-/* Update usb state (usb-state.c) */
-typedef enum {
- USB_DISCONNECTED,
- USB_CONNECTED,
-} usb_connection_state_e;
-
-void add_usb_config(const struct usb_config_ops *ops);
-void remove_usb_config(const struct usb_config_ops *ops);
-
-int usb_change_mode(unsigned int mode);
-
-void usb_state_update_state(usb_connection_state_e state, unsigned int mode);
-void usb_state_retrieve_selected_mode(void);
-char *usb_state_get_mode_str(unsigned int mode, char *str, size_t len);
-unsigned int usb_state_get_selected_mode(void);
-void usb_state_set_selected_mode(unsigned int mode);
-unsigned int usb_state_get_current_mode(void);
-
-int usb_operation_start(unsigned int mode);
-int usb_operation_stop(unsigned int mode);
-
-/* dbus methods/signals (usb-dbus.c) */
-enum {
- DISABLED,
- ENABLED,
-};
-
-int usb_dbus_init(void);
-
-void broadcast_usb_config_enabled(int state);
-void broadcast_usb_state_changed(void);
-void broadcast_usb_mode_changed(void);
-
-#endif /* __USB_CLIENT_H__ */
+++ /dev/null
-/*
- * deviced
- *
- * Copyright (c) 2015 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.
- */
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <limits.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <tzplatform_config.h>
-
-#include "core/log.h"
-#include "core/devices.h"
-#include "core/edbus-handler.h"
-#include "core/device-notifier.h"
-#include "core/udev.h"
-#include "core/list.h"
-#include "core/device-idler.h"
-#include "apps/apps.h"
-
-#define USB_INTERFACE_CLASS "bInterfaceClass"
-#define USB_INTERFACE_SUBCLASS "bInterfaceSubClass"
-#define USB_INTERFACE_PROTOCOL "bInterfaceProtocol"
-#define USB_VENDOR_ID "idVendor"
-#define USB_PRODUCT_ID "idProduct"
-#define USB_MANUFACTURER "manufacturer"
-#define USB_PRODUCT "product"
-#define USB_SERIAL "serial"
-
-#define USB_HOST_RESULT_SIGNAL "USBHostResult"
-
-#define SIGNAL_USB_HOST_CHANGED "ChangedDevice"
-#define METHOD_GET_CONNECTION_CREDENTIALS "GetConnectionCredentials"
-
-#define ROOTPATH tzplatform_getenv(TZ_SYS_VAR)
-#define POLICY_FILENAME "usbhost-policy"
-
-char *POLICY_FILEPATH;
-
-/**
- * Below usb host class is defined by www.usb.org.
- * Please refer to below site.
- * http://www.usb.org/developers/defined_class
- * You can find the detail class codes in linux/usb/ch9.h.
- * Deviced uses kernel defines.
- */
-#include <linux/usb/ch9.h>
-#define USB_CLASS_ALL 0xffffffff
-#define USB_DEVICE_MAJOR 189
-
-/**
- * HID Standard protocol information.
- * Please refer to below site.
- * http://www.usb.org/developers/hidpage/HID1_11.pdf
- * Below protocol only has meaning
- * if the subclass is a boot interface subclass,
- * otherwise it is 0.
- */
-enum usbhost_hid_protocol {
- USB_HOST_HID_KEYBOARD = 1,
- USB_HOST_HID_MOUSE = 2,
-};
-
-enum usbhost_state {
- USB_HOST_REMOVED,
- USB_HOST_ADDED,
-};
-
-struct usbhost_device {
- char devpath[PATH_MAX]; /* unique info. */
- int baseclass;
- int subclass;
- int protocol;
- int vendorid;
- int productid;
- char *manufacturer;
- char *product;
- char *serial;
-};
-
-static dd_list *usbhost_list;
-
-enum policy_value {
- POLICY_NONE,
- POLICY_ALLOW_ALWAYS,
- POLICY_ALLOW_NOW,
- POLICY_DENY_ALWAYS,
- POLICY_DENY_NOW,
-};
-
-#define UID_KEY "UnixUserID"
-#define PID_KEY "ProcessID"
-#define SEC_LABEL_KEY "LinuxSecurityLabel"
-#define ENTRY_LINE_SIZE 256
-
-struct user_credentials {
- uint32_t uid;
- uint32_t pid;
- char *sec_label;
-};
-
-struct device_desc{
- uint16_t bcdUSB;
- uint8_t bDeviceClass;
- uint8_t bDeviceSubClass;
- uint8_t bDeviceProtocol;
- uint16_t idVendor;
- uint16_t idProduct;
- uint16_t bcdDevice;
-};
-
-struct policy_entry {
- struct user_credentials creds;
- union {
- struct usb_device_descriptor device;
- /* for temporary policy */
- char devpath[PATH_MAX];
- };
-
- enum policy_value value;
-};
-
-static inline int is_policy_temporary(struct policy_entry *entry) {
- return entry->value == POLICY_ALLOW_NOW ||
- entry->value == POLICY_DENY_NOW;
-}
-
-dd_list *access_list;
-
-struct usbhost_open_request {
- DBusMessage *msg;
- E_DBus_Connection *reply_conn;
- char *path;
- struct user_credentials cred;
- struct usb_device_descriptor desc;
- char devpath[PATH_MAX];
-} *current_request = NULL;
-
-static void print_usbhost(struct usbhost_device *usbhost)
-{
- if (!usbhost)
- return;
-
- _I("devpath : %s", usbhost->devpath);
- _I("interface baseclass : %xh", usbhost->baseclass);
- _I("interface subclass : %xh", usbhost->subclass);
- _I("interface protocol : %xh", usbhost->protocol);
- _I("vendor id : %xh", usbhost->vendorid);
- _I("product id : %xh", usbhost->productid);
- _I("manufacturer : %s", usbhost->manufacturer);
- _I("product : %s", usbhost->product);
- _I("serial : %s", usbhost->serial);
-}
-
-static void broadcast_usbhost_signal(enum usbhost_state state,
- struct usbhost_device *usbhost)
-{
- char *arr[10];
- char str_state[32];
- char str_baseclass[32];
- char str_subclass[32];
- char str_protocol[32];
- char str_vendorid[32];
- char str_productid[32];
-
- if (!usbhost)
- return;
-
- snprintf(str_state, sizeof(str_state), "%d", state);
- arr[0] = str_state;
- /* devpath is always valid */
- arr[1] = usbhost->devpath;
- snprintf(str_baseclass, sizeof(str_baseclass),
- "%d", usbhost->baseclass);
- arr[2] = str_baseclass;
- snprintf(str_subclass, sizeof(str_subclass),
- "%d", usbhost->subclass);
- arr[3] = str_subclass;
- snprintf(str_protocol, sizeof(str_protocol),
- "%d", usbhost->protocol);
- arr[4] = str_protocol;
- snprintf(str_vendorid, sizeof(str_vendorid),
- "%d", usbhost->vendorid);
- arr[5] = str_vendorid;
- snprintf(str_productid, sizeof(str_productid),
- "%d", usbhost->productid);
- arr[6] = str_productid;
- arr[7] = (!usbhost->manufacturer ? "" : usbhost->manufacturer);
- arr[8] = (!usbhost->product ? "" : usbhost->product);
- arr[9] = (!usbhost->serial ? "" : usbhost->serial);
-
- broadcast_edbus_signal(DEVICED_PATH_USBHOST,
- DEVICED_INTERFACE_USBHOST,
- SIGNAL_USB_HOST_CHANGED,
- "isiiiiisss", arr);
-}
-
-static int add_usbhost_list(struct udev_device *dev, const char *devpath)
-{
- struct usbhost_device *usbhost;
- const char *str;
- struct udev_device *parent;
-
- /* allocate new usbhost device */
- usbhost = calloc(1, sizeof(struct usbhost_device));
- if (!usbhost) {
- _E("fail to allocate usbhost memory : %d", errno);
- return -errno;
- }
-
- /* save the devnode */
- snprintf(usbhost->devpath, sizeof(usbhost->devpath),
- "%s", devpath);
-
- /* get usb interface informations */
- str = udev_device_get_sysattr_value(dev, USB_INTERFACE_CLASS);
- if (str)
- usbhost->baseclass = (int)strtol(str, NULL, 16);
- str = udev_device_get_sysattr_value(dev, USB_INTERFACE_SUBCLASS);
- if (str)
- usbhost->subclass = (int)strtol(str, NULL, 16);
- str = udev_device_get_sysattr_value(dev, USB_INTERFACE_PROTOCOL);
- if (str)
- usbhost->protocol = (int)strtol(str, NULL, 16);
-
- /* parent has a lot of information about usb_interface */
- parent = udev_device_get_parent(dev);
- if (!parent) {
- _E("fail to get parent");
- free(usbhost);
- return -EPERM;
- }
-
- /* get usb device informations */
- str = udev_device_get_sysattr_value(parent, USB_VENDOR_ID);
- if (str)
- usbhost->vendorid = (int)strtol(str, NULL, 16);
- str = udev_device_get_sysattr_value(parent, USB_PRODUCT_ID);
- if (str)
- usbhost->productid = (int)strtol(str, NULL, 16);
- str = udev_device_get_sysattr_value(parent, USB_MANUFACTURER);
- if (str)
- usbhost->manufacturer = strdup(str);
- str = udev_device_get_sysattr_value(parent, USB_PRODUCT);
- if (str)
- usbhost->product = strdup(str);
- str = udev_device_get_sysattr_value(parent, USB_SERIAL);
- if (str)
- usbhost->serial = strdup(str);
-
- DD_LIST_APPEND(usbhost_list, usbhost);
-
- broadcast_usbhost_signal(USB_HOST_ADDED, usbhost);
-
- /* for debugging */
- _I("USB HOST Added");
- print_usbhost(usbhost);
-
- return 0;
-}
-
-static int remove_usbhost_list(const char *devpath)
-{
- struct usbhost_device *usbhost;
- dd_list *n, *next;
-
- /* find the matched item */
- DD_LIST_FOREACH_SAFE(usbhost_list, n, next, usbhost) {
- if (!strncmp(usbhost->devpath,
- devpath, sizeof(usbhost->devpath)))
- break;
- }
-
- if (!usbhost) {
- _E("fail to find the matched usbhost device");
- return -ENODEV;
- }
-
- broadcast_usbhost_signal(USB_HOST_REMOVED, usbhost);
-
- /* for debugging */
- _I("USB HOST Removed");
- _I("devpath : %s", usbhost->devpath);
-
- DD_LIST_REMOVE(usbhost_list, usbhost);
- free(usbhost->manufacturer);
- free(usbhost->product);
- free(usbhost->serial);
- free(usbhost);
-
- return 0;
-}
-
-static void remove_all_usbhost_list(void)
-{
- struct usbhost_device *usbhost;
- dd_list *n, *next;
-
- DD_LIST_FOREACH_SAFE(usbhost_list, n, next, usbhost) {
-
- /* for debugging */
- _I("USB HOST Removed");
- _I("devpath : %s", usbhost->devpath);
-
- DD_LIST_REMOVE(usbhost_list, usbhost);
- free(usbhost->manufacturer);
- free(usbhost->product);
- free(usbhost->serial);
- free(usbhost);
- }
-}
-
-static void uevent_usbhost_handler(struct udev_device *dev)
-{
- const char *subsystem;
- const char *devtype;
- const char *devpath;
- const char *action;
- struct policy_entry *entry;
- dd_list *n, *next;
-
- /**
- * Usb host device must have at least one interface.
- * An interface is matched with a specific usb class.
- */
- subsystem = udev_device_get_subsystem(dev);
- devtype = udev_device_get_devtype(dev);
- if (!subsystem || !devtype) {
- _E("fail to get subsystem or devtype");
- return;
- }
-
- /* devpath is an unique information among usb host devices */
- devpath = udev_device_get_devpath(dev);
- if (!devpath) {
- _E("fail to get devpath from udev_device");
- return;
- }
-
- action = udev_device_get_action(dev);
- _I("subsystem : %s, devtype : %s, action : %s", subsystem, devtype, action);
- /* Policy is valid for entire device, thus we check this devtype here */
- if (strncmp(subsystem, USB_SUBSYSTEM, sizeof(USB_SUBSYSTEM)) == 0 &&
- strncmp(devtype, USB_DEVICE_DEVTYPE, sizeof(USB_DEVICE_DEVTYPE)) == 0 &&
- strncmp(action, UDEV_REMOVE, sizeof(UDEV_REMOVE)) == 0) {
- DD_LIST_FOREACH_SAFE(access_list, n, next, entry) {
- if (is_policy_temporary(entry) &&
- strcmp(devpath, entry->devpath) == 0) {
- _I("removed temporary policy for %s", devpath);
- DD_LIST_REMOVE(access_list, entry);
- free(entry->creds.sec_label);
- free(entry);
- }
- }
- }
-
- /**
- * if devtype is not matched with usb subsystem
- * and usb_interface devtype, skip.
- */
- if (strncmp(subsystem, USB_SUBSYSTEM, sizeof(USB_SUBSYSTEM)) ||
- strncmp(devtype, USB_INTERFACE_DEVTYPE, sizeof(USB_INTERFACE_DEVTYPE)))
- return;
-
- if (!strncmp(action, UDEV_ADD, sizeof(UDEV_ADD)))
- add_usbhost_list(dev, devpath);
- else if (!strncmp(action, UDEV_REMOVE, sizeof(UDEV_REMOVE)))
- remove_usbhost_list(devpath);
-}
-
-static int usbhost_init_from_udev_enumerate(void)
-{
- struct udev *udev;
- struct udev_enumerate *enumerate;
- struct udev_list_entry *list_entry;
- struct udev_device *dev;
- const char *syspath;
- const char *devpath;
-
- udev = udev_new();
- if (!udev) {
- _E("fail to create udev library context");
- return -EPERM;
- }
-
- /* create a list of the devices in the 'usb' subsystem */
- enumerate = udev_enumerate_new(udev);
- if (!enumerate) {
- _E("fail to create an enumeration context");
- return -EPERM;
- }
-
- udev_enumerate_add_match_subsystem(enumerate, USB_SUBSYSTEM);
- udev_enumerate_add_match_property(enumerate,
- UDEV_DEVTYPE, USB_INTERFACE_DEVTYPE);
- udev_enumerate_scan_devices(enumerate);
-
- udev_list_entry_foreach(list_entry,
- udev_enumerate_get_list_entry(enumerate)) {
- syspath = udev_list_entry_get_name(list_entry);
- if (!syspath)
- continue;
-
- dev = udev_device_new_from_syspath(udev_enumerate_get_udev(enumerate),
- syspath);
- if (!dev)
- continue;
-
- /* devpath is an unique information among usb host devices */
- devpath = udev_device_get_devpath(dev);
- if (!devpath) {
- _E("fail to get devpath from %s device", syspath);
- continue;
- }
-
- /* add usbhost list */
- add_usbhost_list(dev, devpath);
-
- udev_device_unref(dev);
- }
-
- udev_enumerate_unref(enumerate);
- udev_unref(udev);
- return 0;
-}
-
-static DBusMessage *print_device_list(E_DBus_Object *obj, DBusMessage *msg)
-{
- dd_list *elem;
- struct usbhost_device *usbhost;
- int cnt = 0;
-
- DD_LIST_FOREACH(usbhost_list, elem, usbhost) {
- _I("== [%2d USB HOST DEVICE] ===============", cnt++);
- print_usbhost(usbhost);
- }
-
- return dbus_message_new_method_return(msg);
-}
-
-static DBusMessage *get_device_list(E_DBus_Object *obj, DBusMessage *msg)
-{
- DBusMessageIter iter;
- DBusMessageIter arr;
- DBusMessageIter s;
- DBusMessage *reply;
- dd_list *elem;
- struct usbhost_device *usbhost;
- const char *str;
- int baseclass;
-
- reply = dbus_message_new_method_return(msg);
-
- if (!dbus_message_get_args(msg, NULL,
- DBUS_TYPE_INT32, &baseclass, DBUS_TYPE_INVALID)) {
- _E("there is no message");
- goto out;
- }
-
- dbus_message_iter_init_append(reply, &iter);
- dbus_message_iter_open_container(&iter,
- DBUS_TYPE_ARRAY, "(siiiiisss)", &arr);
-
- DD_LIST_FOREACH(usbhost_list, elem, usbhost) {
- if (baseclass != USB_CLASS_ALL && usbhost->baseclass != baseclass)
- continue;
- dbus_message_iter_open_container(&arr, DBUS_TYPE_STRUCT, NULL, &s);
- str = usbhost->devpath;
- dbus_message_iter_append_basic(&s, DBUS_TYPE_STRING, &str);
- dbus_message_iter_append_basic(&s,
- DBUS_TYPE_INT32, &usbhost->baseclass);
- dbus_message_iter_append_basic(&s,
- DBUS_TYPE_INT32, &usbhost->subclass);
- dbus_message_iter_append_basic(&s,
- DBUS_TYPE_INT32, &usbhost->protocol);
- dbus_message_iter_append_basic(&s,
- DBUS_TYPE_INT32, &usbhost->vendorid);
- dbus_message_iter_append_basic(&s,
- DBUS_TYPE_INT32, &usbhost->productid);
- str = (!usbhost->manufacturer ? "" : usbhost->manufacturer);
- dbus_message_iter_append_basic(&s, DBUS_TYPE_STRING, &str);
- str = (!usbhost->product ? "" : usbhost->product);
- dbus_message_iter_append_basic(&s, DBUS_TYPE_STRING, &str);
- str = (!usbhost->serial ? "" : usbhost->serial);
- dbus_message_iter_append_basic(&s, DBUS_TYPE_STRING, &str);
- dbus_message_iter_close_container(&arr, &s);
- }
-
- dbus_message_iter_close_container(&iter, &arr);
-
-out:
- return reply;
-}
-
-static DBusMessage *get_device_list_count(E_DBus_Object *obj, DBusMessage *msg)
-{
- dd_list *elem;
- struct usbhost_device *usbhost;
- int baseclass;
- int ret = 0;
-
- if (!dbus_message_get_args(msg, NULL,
- DBUS_TYPE_INT32, &baseclass, DBUS_TYPE_INVALID)) {
- _E("there is no message");
- ret = -EINVAL;
- goto out;
- }
-
- DD_LIST_FOREACH(usbhost_list, elem, usbhost) {
- if (baseclass != USB_CLASS_ALL && usbhost->baseclass != baseclass)
- continue;
- ret++;
- }
-
-out:
- return make_reply_message(msg, ret);
-}
-
-static struct uevent_handler uh = {
- .subsystem = USB_SUBSYSTEM,
- .uevent_func = uevent_usbhost_handler,
-};
-
-static const char *policy_value_str(enum policy_value value) {
- switch (value) {
- case POLICY_ALLOW_ALWAYS:
- return "ALLOW";
- case POLICY_ALLOW_NOW:
- return "ALLOW_NOW";
- case POLICY_DENY_ALWAYS:
- return "DENY";
- case POLICY_DENY_NOW:
- return "DENY_NOW";
- default:
- return "UNKNOWN";
- }
-}
-
-static int get_policy_value_from_str(const char *str) {
- if (strncmp("ALLOW", str, 5) == 0)
- return POLICY_ALLOW_ALWAYS;
- if (strncmp("ALLOW_NOW", str, 5) == 0)
- return POLICY_ALLOW_NOW;
- if (strncmp("DENY", str, 4) == 0)
- return POLICY_DENY_ALWAYS;
- if (strncmp("DENY_NOW", str, 4) == 0)
- return POLICY_DENY_NOW;
- return -1;
-}
-
-static inline int marshal_policy_entry(char *buf, int len, struct policy_entry *entry) {
- if (is_policy_temporary(entry))
- return snprintf(buf, len, "%d %s %s %s\n",
- entry->creds.uid,
- entry->creds.sec_label,
- entry->devpath,
- policy_value_str(entry->value));
- return snprintf(buf, len, "%d %s %04x %02x %02x %02x %04x %04x %04x %s\n",
- entry->creds.uid,
- entry->creds.sec_label,
- entry->device.bcdUSB,
- entry->device.bDeviceClass,
- entry->device.bDeviceSubClass,
- entry->device.bDeviceProtocol,
- entry->device.idVendor,
- entry->device.idProduct,
- entry->device.bcdDevice,
- policy_value_str(entry->value));
-}
-
-static DBusMessage *print_policy(E_DBus_Object *obj, DBusMessage *msg) {
- char line[ENTRY_LINE_SIZE];
- dd_list *elem;
- struct policy_entry *entry;
- int ret;
-
- _I("USB access policy:");
- DD_LIST_FOREACH(access_list, elem, entry) {
- ret = marshal_policy_entry(line, ENTRY_LINE_SIZE, entry);
- if (ret < 0)
- break;
- _I("\t%s", line);
- }
-
- return dbus_message_new_method_return(msg);
-}
-
-static int store_policy(void)
-{
- int fd;
- dd_list *elem;
- struct policy_entry *entry;
- char line[256];
- int ret;
-
- fd = open(POLICY_FILEPATH, O_WRONLY | O_CREAT, 0664);
- if (fd < 0) {
- _E("Could not open policy file for writing: %m");
- return -errno;
- }
-
- DD_LIST_FOREACH(access_list, elem, entry) {
- if (is_policy_temporary(entry))
- continue;
-
- ret = marshal_policy_entry(line, ENTRY_LINE_SIZE, entry);
- if (ret < 0) {
- _E("Serialization failed: %m");
- goto out;
- }
-
- ret = write(fd, line, ret);
- if (ret < 0) {
- ret = -errno;
- _E("Error writing policy entry: %m");
- goto out;
- }
- }
-
- _I("Policy stored in %s", POLICY_FILEPATH);
-
- ret = 0;
-
-out:
- close(fd);
- return ret;
-}
-
-static int read_policy(void)
-{
- FILE *fp;
- struct policy_entry *entry;
- char *line = NULL, value_str[256];
- int ret = -1;
- int count = 0;
- size_t len;
-
- fp = fopen(POLICY_FILEPATH, "r");
- if (!fp) {
- ret = -errno;
- _E("Could not open policy file for reading: %m");
- return ret;
- }
-
- while ((ret = getline(&line, &len, fp)) != -1) {
- entry = malloc(sizeof(*entry));
- if (!entry) {
- ret = -ENOMEM;
- _E("No memory: %m");
- goto out;
- }
-
- entry->creds.sec_label = calloc(ENTRY_LINE_SIZE, 1);
- if (!entry->creds.sec_label) {
- _E("No memory: %m");
- goto out;
- }
-
- ret = sscanf(line, "%d %255s %04hx %02hhx %02hhx %02hhx %04hx %04hx %04hx %255s\n",
- &entry->creds.uid,
- entry->creds.sec_label,
- &entry->device.bcdUSB,
- &entry->device.bDeviceClass,
- &entry->device.bDeviceSubClass,
- &entry->device.bDeviceProtocol,
- &entry->device.idVendor,
- &entry->device.idProduct,
- &entry->device.bcdDevice,
- value_str);
- if (ret == EOF) {
- _E("Error reading line: %m");
- free(entry->creds.sec_label);
- free(entry);
- goto out;
- }
-
- entry->value = get_policy_value_from_str(value_str);
- if (entry->value < 0) {
- _E("Invalid policy value: %s", value_str);
- ret = -EINVAL;
- goto out;
- }
-
- _I("%04x:%04x : %s", entry->device.idVendor, entry->device.idProduct,
- value_str);
-
- DD_LIST_APPEND(access_list, entry);
- count++;
- }
-
- _I("Found %d policy entries", count);
- ret = 0;
-
-out:
- fclose(fp);
- free(line);
-
- return ret;
-}
-
-static int get_device_desc(const char *filepath, struct usb_device_descriptor *desc, char *devpath)
-{
- char *path = NULL;
- const char *rdevpath;
- struct stat st;
- int ret;
- int fd = -1;
- struct udev *udev = NULL;
- struct udev_device *udev_device = NULL;
-
- ret = stat(filepath, &st);
- if (ret < 0) {
- ret = -errno;
- _E("Could not stat %s: %m", filepath);
- goto out;
- }
-
- if (!S_ISCHR(st.st_mode) ||
- major(st.st_rdev) != USB_DEVICE_MAJOR) {
- ret = -EINVAL;
- _E("Not an USB device");
- goto out;
- }
-
- udev = udev_new();
- if (!udev) {
- _E("Could not create udev contect");
- ret = -ENOMEM;
- goto out;
- }
-
- udev_device = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
- if (!udev_device) {
- _E("udev could not find device");
- ret = -ENOENT;
- goto out;
- }
-
- rdevpath = udev_device_get_devpath(udev_device);
- strncpy(devpath, rdevpath, PATH_MAX);
-
- ret = asprintf(&path, "/sys/dev/char/%d:%d/descriptors", major(st.st_rdev), minor(st.st_rdev));
- if (ret < 0) {
- ret = -ENOMEM;
- _E("asprintf failed");
- goto out;
- }
-
- _I("Opening descriptor at %s", path);
- fd = open(path, O_RDONLY);
- if (fd < 0) {
- ret = -errno;
- _E("Failed to open %s: %m", path);
- goto out;
- }
-
- ret = read(fd, desc, sizeof(*desc));
- if (ret < 0) {
- ret = -errno;
- _E("Failed to read %s: %m", path);
- goto out;
- }
-
- ret = 0;
-
-out:
- if (fd >= 0)
- close(fd);
- free(path);
-
- udev_device_unref(udev_device);
- udev_unref(udev);
-
- return ret;
-}
-
-static void store_idler_cb(void *data)
-{
- store_policy();
-}
-
-static void destroy_open_request(struct usbhost_open_request *req)
-{
- _D("Destroing request structure");
- free(req->path);
- req->path = NULL;
- req->reply_conn = NULL;
- dbus_message_unref(req->msg);
- req->msg = NULL;
-}
-
-static void finish_opening(struct usbhost_open_request *req, int policy)
-{
- int ret;
- int fd = -1;
- DBusMessageIter iter;
- DBusMessage *reply;
- const char *err;
-
- if (req->path == NULL)
- return;
-
- switch (policy) {
- case POLICY_ALLOW_NOW:
- case POLICY_ALLOW_ALWAYS:
- fd = open(req->path, O_RDWR);
- if (fd < 0) {
- ret = -errno;
- err = DBUS_ERROR_FAILED;
- _E("Unable to open file (%s): %m", req->path);
- } else
- ret = 0;
- break;
- case POLICY_DENY_NOW:
- case POLICY_DENY_ALWAYS:
- ret = -EACCES;
- err = DBUS_ERROR_ACCESS_DENIED;
- break;
- default:
- ret = -EINVAL;
- err = DBUS_ERROR_FAILED;
- break;
- }
-
- if (ret < 0) {
- reply = dbus_message_new_error(req->msg, err, NULL);
- if (!reply) {
- _E("Cannot allocate memory for error message");
- goto out;
- }
- } else {
- reply = dbus_message_new_method_return(req->msg);
- if (!reply) {
- _E("Cannot allocate memory for message");
- goto out;
- }
-
- dbus_message_iter_init_append(reply, &iter);
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_UNIX_FD, &fd);
- }
-
- e_dbus_message_send(req->reply_conn, reply, NULL, 0, NULL);
-
-out:
- destroy_open_request(req);
- if(fd >= 0)
- close(fd);
- _I("Popup destroyed");
-}
-
-static int spawn_popup(struct usbhost_open_request *req)
-{
- char pid_str[8];
- int ret;
-
- if (!req)
- return -EINVAL;
-
- /* Handle for the previous popup */
- if (current_request) {
- finish_opening(current_request, POLICY_DENY_NOW);
- free(current_request);
- current_request = NULL;
- }
-
- _I("Launching popup");
-
- snprintf(pid_str, sizeof(pid_str), "%d", req->cred.pid);
- ret = launch_system_app(APP_DEFAULT, 4, APP_KEY_TYPE, "usbhost", "_APP_PID_", pid_str);
- if (ret < 0) {
- _E("could not launch system popup");
- return ret;
- }
-
- return ret;
-}
-
-static void popup_result_signal_handler(void *data, DBusMessage *msg)
-{
- DBusError err;
- int allow, always;
- int ret;
- struct policy_entry *entry;
- int value;
- struct usbhost_open_request *req;
-
- req = current_request;
-
- if (!dbus_message_is_signal(msg, POPUP_INTERFACE_SYSTEM, USB_HOST_RESULT_SIGNAL))
- return;
-
- dbus_error_init(&err);
- ret = dbus_message_get_args(msg, &err,
- DBUS_TYPE_INT32, &allow,
- DBUS_TYPE_INT32, &always,
- DBUS_TYPE_INVALID);
-
- if (!ret) {
- _E("no message: [%s:%s]", err.name, err.message);
- value = POLICY_DENY_NOW;
- goto out;
- }
-
- if (allow && always)
- value = POLICY_ALLOW_ALWAYS;
- else if (!allow && always)
- value = POLICY_DENY_ALWAYS;
- else if (allow && !always)
- value = POLICY_ALLOW_NOW;
- else
- value = POLICY_DENY_NOW;
-
- /* Save the policy */
-
- entry = calloc(sizeof(*entry), 1);
- if (!entry) {
- _E("No memory");
- goto out;
- }
-
- entry->creds.uid = req->cred.uid;
- entry->creds.sec_label = calloc(strlen(req->cred.sec_label)+1, 1);
- if (!entry->creds.sec_label) {
- _E("No memory");
- free(entry);
- goto out;
- }
-
- strncpy(entry->creds.sec_label, req->cred.sec_label, strlen(req->cred.sec_label));
-
- switch (value) {
- case POLICY_ALLOW_ALWAYS:
- case POLICY_DENY_ALWAYS:
- entry->device.bcdUSB = le16toh(req->desc.bcdUSB);
- entry->device.bDeviceClass = req->desc.bDeviceClass;
- entry->device.bDeviceSubClass = req->desc.bDeviceSubClass;
- entry->device.bDeviceProtocol = req->desc.bDeviceProtocol;
- entry->device.idVendor = le16toh(req->desc.idVendor);
- entry->device.idProduct = le16toh(req->desc.idProduct);
- entry->device.bcdDevice = le16toh(req->desc.bcdDevice);
-
- _I("Added policy entry: %d %s %04x %02x %02x %02x %04x %04x %04x %s",
- entry->creds.uid,
- entry->creds.sec_label,
- entry->device.bcdUSB,
- entry->device.bDeviceClass,
- entry->device.bDeviceSubClass,
- entry->device.bDeviceProtocol,
- entry->device.idVendor,
- entry->device.idProduct,
- entry->device.bcdDevice,
- policy_value_str(value));
- break;
- case POLICY_ALLOW_NOW:
- case POLICY_DENY_NOW:
- strncpy(entry->devpath, req->devpath, strlen(req->devpath));
- _I("Added temporary policy entry: %d %s %s %s",
- entry->creds.uid,
- entry->creds.sec_label,
- entry->devpath,
- policy_value_str(value));
- break;
- }
-
- entry->value = value;
- DD_LIST_APPEND(access_list, entry);
-
- ret = add_idle_request(store_idler_cb, NULL);
- if (ret < 0) {
- _E("fail to add store idle request : %d", ret);
- store_idler_cb(NULL);
- }
-
-out:
- finish_opening(req, value);
- free(current_request);
- current_request = NULL;
- dbus_error_free(&err);
-}
-
-static int get_policy_value(struct usbhost_open_request *req)
-{
- int ret;
- dd_list *elem;
- struct policy_entry *entry;
-
- memset(&req->desc, 0, sizeof(req->desc));
-
- _I("Requested access from user %d to %s", req->cred.uid, req->path);
- ret = get_device_desc(req->path, &req->desc, req->devpath);
- if (ret < 0) {
- _E("Could not get device descriptor");
- return ret;
- }
-
- DD_LIST_FOREACH(access_list, elem, entry) {
- if(entry->creds.uid != req->cred.uid
- || strncmp(entry->creds.sec_label, req->cred.sec_label, strlen(req->cred.sec_label)) != 0)
- continue;
-
- if (is_policy_temporary(entry) ? strncmp(entry->devpath, req->devpath, PATH_MAX) :
- entry->device.bcdUSB != le16toh(req->desc.bcdUSB)
- || entry->device.bDeviceClass != req->desc.bDeviceClass
- || entry->device.bDeviceSubClass != req->desc.bDeviceSubClass
- || entry->device.bDeviceProtocol != req->desc.bDeviceProtocol
- || entry->device.idVendor != le16toh(req->desc.idVendor)
- || entry->device.idProduct != le16toh(req->desc.idProduct)
- || entry->device.bcdDevice != le16toh(req->desc.bcdDevice))
- continue;
-
- _I("Found matching policy entry: %s", policy_value_str(entry->value));
-
- return entry->value;
- }
-
- return POLICY_NONE;
-}
-
-static int creds_read_uint32(DBusMessageIter *iter, uint32_t *dest)
-{
- int type;
- DBusMessageIter sub;
-
- dbus_message_iter_next(iter);
-
- dbus_message_iter_recurse(iter, &sub);
- type = dbus_message_iter_get_arg_type(&sub);
- if (type != DBUS_TYPE_UINT32) {
- _E("expected uint32");
- return -EINVAL;
- }
-
- dbus_message_iter_get_basic(&sub, dest);
-
- return 0;
-}
-
-static int creds_read_label(DBusMessageIter *iter, char **dest)
-{
- int type;
- DBusMessageIter sub, byte;
- int n;
-
- dbus_message_iter_next(iter);
-
- dbus_message_iter_recurse(iter, &sub);
- type = dbus_message_iter_get_arg_type(&sub);
- if (type != DBUS_TYPE_ARRAY) {
- _E("expected array of bytes");
- return -EINVAL;
- }
-
- dbus_message_iter_recurse(&sub, &byte);
- dbus_message_iter_get_fixed_array(&byte, dest, &n);
-
- return n;
-}
-
-static int get_caller_credentials(DBusMessage *msg, struct user_credentials *cred)
-{
- const char *cid;
- char *key;
- char *arr[1];
- DBusMessage *reply;
- DBusMessageIter iter, dict, entry;
- dbus_bool_t ret;
- int type;
- int reti;
-
- cid = dbus_message_get_sender(msg);
- if (!cid) {
- _E("Unable to identify client");
- return -1;
- }
-
- arr[0] = (char *)cid;
- reply = dbus_method_sync_with_reply(DBUS_BUS_NAME,
- DBUS_OBJECT_PATH,
- DBUS_INTERFACE_NAME,
- METHOD_GET_CONNECTION_CREDENTIALS,
- "s", arr);
-
- if (!reply) {
- _E("Cannot get connection credentials for %s", cid);
- return -1;
- }
-
- ret = dbus_message_iter_init(reply, &iter);
- if (!ret) {
- _E("could not init msg iterator");
- reti = -1;
- goto out;
- }
-
- type = dbus_message_iter_get_arg_type(&iter);
- if (type != DBUS_TYPE_ARRAY) {
- _E("Expected array (%s)", cid);
- reti = -EINVAL;
- goto out;
- }
-
- dbus_message_iter_recurse(&iter, &dict);
-
- while ((type = dbus_message_iter_get_arg_type(&dict)) != DBUS_TYPE_INVALID) {
- if (type != DBUS_TYPE_DICT_ENTRY) {
- _E("Expected dict entry (%s)", cid);
- reti = -EINVAL;
- goto out;
- }
-
- dbus_message_iter_recurse(&dict, &entry);
- type = dbus_message_iter_get_arg_type(&entry);
- if (type != DBUS_TYPE_STRING) {
- _E("Expected string (%s)", cid);
- reti = -EINVAL;
- goto out;
- }
-
- dbus_message_iter_get_basic(&entry, &key);
- if (strncmp(key, UID_KEY, sizeof(UID_KEY)) == 0) {
- reti = creds_read_uint32(&entry, &cred->uid);
- if (reti < 0)
- goto out;
- } else if (strncmp(key, SEC_LABEL_KEY, sizeof(SEC_LABEL_KEY)) == 0) {
- reti = creds_read_label(&entry, &cred->sec_label);
- if (reti < 0)
- goto out;
- } else if (strncmp(key, PID_KEY, sizeof(PID_KEY)) == 0) {
- reti = creds_read_uint32(&entry, &cred->pid);
- if (reti < 0)
- goto out;
- }
-
- dbus_message_iter_next(&dict);
- }
-
- reti = 0;
-
-out:
- dbus_message_unref(reply);
- return reti;
-}
-
-static void remove_all_access_list(void)
-{
- struct policy_entry *entry;
- dd_list *n, *next;
-
- DD_LIST_FOREACH_SAFE(access_list, n, next, entry) {
- DD_LIST_REMOVE(access_list, entry);
- free(entry->creds.sec_label);
- free(entry);
- }
-}
-
-static DBusMessage *open_device(E_DBus_Object *obj, DBusMessage *msg)
-{
- DBusError err;
- dbus_bool_t dbus_ret;
- int ret = 0;
- int policy;
- char *path;
- struct usbhost_open_request *req;
-
- dbus_error_init(&err);
-
-
- req = calloc(sizeof(*req), 1);
- if (!req) {
- _E("no memory");
- return dbus_message_new_error(msg, DBUS_ERROR_FAILED, "no memory");
- }
-
- req->msg = dbus_message_ref(msg);
- req->reply_conn = e_dbus_object_conn_get(obj);
-
- ret = get_caller_credentials(msg, &req->cred);
- if (ret < 0) {
- _E("Unable to get credentials for caller : %d", ret);
- goto out;
- }
-
- dbus_ret = dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID);
- if (!dbus_ret) {
- _E("Unable to get arguments from message: %s", err.message);
- ret = -EINVAL;
- goto out;
- }
-
- req->path = strdup(path);
- policy = get_policy_value(req);
- if (policy < 0) {
- _E("Could not get policy value (%d)", policy);
- ret = -1;
- goto out;
- }
-
- /* Need to ask user */
- if (policy == POLICY_NONE) {
- ret = spawn_popup(req);
- if (ret < 0) {
- finish_opening(req, POLICY_DENY_NOW);
- free(req);
- return NULL;
- }
-
- current_request = req;
- return NULL;
- }
-
- /* The policy exists for the app */
- _D("Policy exists");
- finish_opening(req, policy);
- free(req);
- return NULL;
-
-out:
- destroy_open_request(req);
- free(req);
- return dbus_message_new_error(msg, DBUS_ERROR_FAILED, NULL);
-}
-
-static const struct edbus_method edbus_methods[] = {
- { "PrintDeviceList", NULL, NULL, print_device_list }, /* for debugging */
- { "PrintPolicy", NULL, NULL, print_policy }, /* for debugging */
- { "GetDeviceList", "i", "a(siiiiisss)", get_device_list },
- { "GetDeviceListCount", "i", "i", get_device_list_count },
- { "OpenDevice", "s", "ih", open_device },
-};
-
-static int booting_done(void *data)
-{
- /**
- * To search the attched usb host device is not an argent task.
- * So deviced does not load while booting time.
- * After booting task is done, it tries to find the attached devices.
- */
- usbhost_init_from_udev_enumerate();
-
- /* unregister booting done notifier */
- unregister_notifier(DEVICE_NOTIFIER_BOOTING_DONE, booting_done);
-
- return 0;
-}
-
-static void usbhost_init(void *data)
-{
- int ret;
-
- /* register usbhost uevent */
- ret = register_kernel_uevent_control(&uh);
- if (ret < 0)
- _E("fail to register usb uevent : %d", ret);
-
- /* register usbhost interface and method */
- ret = register_edbus_interface_and_method(DEVICED_PATH_USBHOST,
- DEVICED_INTERFACE_USBHOST,
- edbus_methods, ARRAY_SIZE(edbus_methods));
- if (ret < 0)
- _E("fail to register edbus interface and method! %d", ret);
-
- /* register notifier */
- register_notifier(DEVICE_NOTIFIER_BOOTING_DONE, booting_done);
-
- ret = asprintf(&POLICY_FILEPATH, "%s/%s", ROOTPATH, POLICY_FILENAME);
- if (ret < 0) {
- _E("no memory for policy path");
- return;
- }
-
- ret = register_edbus_signal_handler(POPUP_PATH_SYSTEM,
- POPUP_INTERFACE_SYSTEM, USB_HOST_RESULT_SIGNAL,
- popup_result_signal_handler);
- if (ret < 0) {
- _E("could not register popup signal handler");
- return;
- }
-
- read_policy();
-}
-
-static void usbhost_exit(void *data)
-{
- int ret;
-
- /* unreigset usbhost uevent */
- ret = unregister_kernel_uevent_control(&uh);
- if (ret < 0)
- _E("fail to unregister usb uevent : %d", ret);
-
- /* remove all usbhost list */
- remove_all_usbhost_list();
-
- store_policy();
- remove_all_access_list();
-
- free(POLICY_FILEPATH);
-}
-
-static const struct device_ops usbhost_device_ops = {
- .name = "usbhost",
- .init = usbhost_init,
- .exit = usbhost_exit,
-};
-
-DEVICE_OPS_REGISTER(&usbhost_device_ops)
+++ /dev/null
-[Unit]
-Description=Enadle sdb at booting time
-DefaultDependencies=no
-
-[Service]
-SmackProcessLabel=System
-ExecStart=/usr/bin/direct_set_debug.sh --sdb-set
-
-[Install]
-WantedBy=basic.target
+++ /dev/null
-[Unit]
-Description=FFS daemon required by usb-host test suite
-
-[Service]
-ExecStart=/usr/bin/usb-host-ffs-test-daemon
-USBFunctionDescriptors=/etc/deviced/usb-host-test/descs
-USBFunctionStrings=/etc/deviced/usb-host-test/strs
+++ /dev/null
-[Unit]
-Description=USB test functionfs socket
-
-[Socket]
-ListenUSBFunction=/run/usb-host-test-ffs
-Service=usb-host-ffs-test-daemon.service
+++ /dev/null
-SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", DEVPATH!="/devices/platform/dummy_hcd.*", MODE="0660", GROUP="system_share", SECLABEL{smack}="*"
-SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", DEVPATH=="/devices/platform/dummy_hcd.*", MODE="0666", GROUP="system_share", SECLABEL{smack}="*"