#include <limits.h>
#include <stdlib.h>
+#include <stddef.h>
#include "transport.h" /* readx(), writex() */
#include "fdevent.h"
-#if !SDB_HOST
#include "commandline_sdbd.h"
-#endif
+#include <tzplatform_config.h>
-#define MAX_PAYLOAD 4096
+#define MAX_PAYLOAD_V1 (4*1024)
+#define MAX_PAYLOAD_V2 (256*1024)
+#define MAX_PAYLOAD MAX_PAYLOAD_V2
#define A_SYNC 0x434e5953
#define A_CNXN 0x4e584e43
#define A_OKAY 0x59414b4f
#define A_CLSE 0x45534c43
#define A_WRTE 0x45545257
+#define A_STAT 0x54415453
+#define A_ENCR 0x40682018 // encryption 메시지
+
+#ifdef SUPPORT_ENCRYPT
+ #define ENCR_SET_ON_REQ 0 // encryption hello 메시지
+ #define ENCR_SET_ON_OK 1 // encryption ack 메시지
+ #define ENCR_SET_OFF 2 // encryption mode off 메시지
+ #define ENCR_GET 3 // encryption status get 메시지
+ #define ENCR_ON_FAIL 4 // encryption on 실패 메시지
+ #define ENCR_OFF_FAIL 5 // encryption off 실패 메시지
+ #define ENCR_ON 1 // encryption on 상태
+ #define ENCR_OFF 0 // encryption off 상태
+#endif
-#define A_VERSION 0x01000000 // SDB protocol version
+#define A_VERSION 0x02000000 // SDB protocol version
#define SDB_VERSION_MAJOR 2 // Used for help/version information
-#define SDB_VERSION_MINOR 1 // Used for help/version information
+#define SDB_VERSION_MINOR 2 // Used for help/version information
+#define SDB_VERSION_PATCH 31 // Used for help/version information
#define SDB_SERVER_VERSION 0 // Increment this when we want to force users to start a new sdb server
*/
int closing;
- /* flag: quit adbd when both ends close the
- ** local service socket
- */
- int exit_on_close;
-
/* the asocket we are connected to
*/
/* socket-type-specific extradata */
void *extra;
- /* A socket is bound to atransport */
+ /* A socket is bound to atransport */
atransport *transport;
};
/* a list of adisconnect callbacks called when the transport is kicked */
int kicked;
adisconnect disconnects;
+ int protocol_version;
+ size_t max_payload;
+
+#ifdef SUPPORT_ENCRYPT
+ unsigned encryption; // 해당 연결이 암호화 모드인지 확인하는 flag , 0 = no-encryption / 1 = encryption
+ int sessionID; // 암호화 세션 ID, 암호화 map에 대한 key
+#endif
};
adisconnect disconnect;
};
+#define UNKNOWN "unknown"
+#define INFOBUF_MAXLEN 64
+#define INFO_VERSION "2.2.0"
+typedef struct platform_info {
+ char platform_info_version[INFOBUF_MAXLEN];
+ char model_name[INFOBUF_MAXLEN]; // Emulator
+ char platform_name[INFOBUF_MAXLEN]; // Tizen
+ char platform_version[INFOBUF_MAXLEN]; // 2.2.1
+ char profile_name[INFOBUF_MAXLEN]; // 2.2.1
+} pinfo;
+
+#define ENABLED "enabled"
+#define DISABLED "disabled"
+#define CAPBUF_SIZE 4096
+#define CAPBUF_ITEMSIZE 32
+#define CAPBUF_L_ITEMSIZE 256
+#define CAPBUF_LL_ITEMSIZE PATH_MAX
+#define SDBD_CAP_VERSION_MAJOR 1
+#define SDBD_CAP_VERSION_MINOR 0
+typedef struct platform_capabilities
+{
+ char secure_protocol[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char intershell_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char filesync_support[CAPBUF_ITEMSIZE]; // push or pull or pushpull or disabled
+ char rootonoff_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char zone_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char multiuser_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char syncwinsz_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char usbproto_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char sockproto_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char appcmd_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char encryption_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char appid2pid_support[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char pkgcmd_debugmode[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char root_permission[CAPBUF_ITEMSIZE]; // enabled or disabled
+
+ char log_enable[CAPBUF_ITEMSIZE]; // enabled or disabled
+ char log_path[CAPBUF_LL_ITEMSIZE]; // path of sdbd log
+
+ char cpu_arch[CAPBUF_ITEMSIZE]; // cpu architecture (ex. x86)
+ char profile_name[CAPBUF_ITEMSIZE]; // profile name (ex. mobile)
+ char vendor_name[CAPBUF_ITEMSIZE]; // vendor name (ex. Tizen)
+ char sdk_toolpath[CAPBUF_L_ITEMSIZE]; // sdk tool path
+ char can_launch[CAPBUF_L_ITEMSIZE]; // target name
+ char device_name[CAPBUF_ITEMSIZE]; // device name
+
+ char platform_version[CAPBUF_ITEMSIZE]; // platform version (ex. 2.3.0)
+ char product_version[CAPBUF_ITEMSIZE]; // product version (ex. 1.0)
+ char sdbd_version[CAPBUF_ITEMSIZE]; // sdbd version
+ char sdbd_plugin_version[CAPBUF_ITEMSIZE]; // sdbd plugin version
+ char sdbd_cap_version[CAPBUF_ITEMSIZE]; // capability version
+} pcap;
+extern pcap g_capabilities;
void print_packet(const char *label, apacket *p);
asocket *create_remote_socket(unsigned id, atransport *t);
void connect_to_remote(asocket *s, const char *destination);
void connect_to_smartsocket(asocket *s);
+size_t asock_get_max_payload(asocket *s);
void fatal(const char *fmt, ...);
void fatal_errno(const char *fmt, ...);
void get_my_path(char *s, size_t maxLen);
int launch_server(int server_port);
-int sdb_main(int is_daemon, int server_port);
+int sdb_main(int server_port);
/* transports are ref-counted
void init_transport_registration(void);
int list_transports(char *buf, size_t bufsize);
void update_transports(void);
+void broadcast_transport(apacket *p);
+int get_connected_count(transport_type type);
asocket* create_device_tracker(void);
void kick_transport( atransport* t );
/* initialize a transport object's func pointers and state */
-#if SDB_HOST
-int get_available_local_transport_index();
-#endif
int init_socket_transport(atransport *t, int s, int port, int local);
void init_usb_transport(atransport *t, usb_handle *usb, int state);
void unregister_usb_transport(usb_handle *usb);
atransport *find_transport(const char *serial);
-#if SDB_HOST
-atransport* find_emulator_transport_by_sdb_port(int sdb_port);
-#endif
int service_to_fd(const char *name);
-#if SDB_HOST
-asocket *host_service_to_socket(const char* name, const char *serial);
-#endif
-#if !SDB_HOST
int init_jdwp(void);
asocket* create_jdwp_service_socket();
asocket* create_jdwp_tracker_service_socket();
int create_jdwp_connection_fd(int jdwp_pid);
-#endif
-#if !SDB_HOST
typedef enum {
BACKUP,
RESTORE
void remount_service(int fd, void *cookie);
char * get_log_file_path(const char * log_name);
-int rootshell_mode;// 0: developer, 1: root
+extern int rootshell_mode; // 0: sdk user, 1: root
+extern int booting_done; // 0: platform booting is in progess 1: platform booting is done
+
+// 1 if locked, 0 if unlocked
+extern int is_pwlocked;
// This is the users and groups config for the platform
#define SID_ROOT 0 /* traditional unix root user */
-#define SID_TTY 5 /* group for /dev/ptmx */
-#define SID_APP 5000 /* application */
-#define SID_DEVELOPER 5100 /* developer with SDK */
-#define SID_APP_LOGGING 6509
-#define SID_SYS_LOGGING 6527
-#define SID_INPUT 1004
-#endif
+#define SDK_USER_NAME tzplatform_getenv(TZ_SDK_USER_NAME)
+#define SDK_TOOL_PATH tzplatform_getenv(TZ_SDK_TOOLS)
+#define STATIC_SDK_USER_ID 5001
+#define STATIC_SDK_GROUP_ID 100
+#define STATIC_SDK_HOME_DIR "/home/owner"
+extern uid_t g_sdk_user_id;
+extern gid_t g_sdk_group_id;
+extern char* g_sdk_home_dir;
+extern char* g_sdk_home_dir_env;
+
+#define ROOT_USER_NAME "root"
+#define STATIC_ROOT_USER_ID 0
+#define STATIC_ROOT_GROUP_ID 0
+#define STATIC_ROOT_HOME_DIR "/root"
+extern uid_t g_root_user_id;
+extern gid_t g_root_group_id;
+extern char* g_root_home_dir;
+extern char* g_root_home_dir_env;
int should_drop_privileges(void);
-int set_developer_privileges();
-void set_root_privileges();
+void send_device_status();
+int set_sdk_user_privileges(int is_drop_capability_after_fork);
+int 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);
+int get_emulator_hostip(char str[], int str_size);
+int get_emulator_guestip(char str[], int str_size);
+
/* packet allocator */
apacket *get_apacket(void);
void put_apacket(apacket *p);
-int check_header(apacket *p);
+int check_header(apacket *p, atransport *t);
int check_data(apacket *p);
-/* define SDB_TRACE to 1 to enable tracing support, or 0 to disable it */
-
-#define SDB_TRACE 1
-
-/* IMPORTANT: if you change the following list, don't
- * forget to update the corresponding 'tags' table in
- * the sdb_trace_init() function implemented in sdb.c
- */
-typedef enum {
- TRACE_SDB = 0,
- TRACE_SOCKETS,
- TRACE_PACKETS,
- TRACE_TRANSPORT,
- TRACE_RWX,
- TRACE_USB,
- TRACE_SYNC,
- TRACE_SYSDEPS,
- TRACE_JDWP,
- TRACE_SERVICES,
- TRACE_PROPERTIES,
- TRACE_SDKTOOLS
-} SdbTrace;
-
-#if SDB_TRACE
-
-#if !SDB_HOST
-/*
- * When running inside the emulator, guest's sdbd can connect to 'sdb-debug'
- * qemud service that can display sdb trace messages (on condition that emulator
- * has been started with '-debug sdb' option).
- */
-
-/* Delivers a trace message to the emulator via QEMU pipe. */
-void sdb_qemu_trace(const char* fmt, ...);
-/* Macro to use to send SDB trace messages to the emulator. */
-#define DQ(...) sdb_qemu_trace(__VA_ARGS__)
-#else
-#define DQ(...) ((void)0)
-#endif /* !SDB_HOST */
-
- extern int sdb_trace_mask;
- extern unsigned char sdb_trace_output_count;
- void sdb_trace_init(void);
-
-# define SDB_TRACING ((sdb_trace_mask & (1 << TRACE_TAG)) != 0)
-
- /* you must define TRACE_TAG before using this macro */
-# define D(...) \
- do { \
- if (SDB_TRACING) { \
- int save_errno = errno; \
- sdb_mutex_lock(&D_lock); \
- fprintf(stderr, "%s::%s():", \
- __FILE__, __FUNCTION__); \
- errno = save_errno; \
- fprintf(stderr, __VA_ARGS__ ); \
- fflush(stderr); \
- sdb_mutex_unlock(&D_lock); \
- errno = save_errno; \
- } \
- } while (0)
-# define DR(...) \
- do { \
- if (SDB_TRACING) { \
- int save_errno = errno; \
- sdb_mutex_lock(&D_lock); \
- errno = save_errno; \
- fprintf(stderr, __VA_ARGS__ ); \
- fflush(stderr); \
- sdb_mutex_unlock(&D_lock); \
- errno = save_errno; \
- } \
- } while (0)
-#else
-# define D(...) ((void)0)
-# define DR(...) ((void)0)
-# define SDB_TRACING 0
-#endif
-
-
#if !TRACE_PACKETS
#define print_packet(tag,p) do {} while (0)
#endif
int local_connect_arbitrary_ports(int console_port, int sdb_port, const char *device_name);
/* usb host/client interface */
-void usb_init();
-void usb_cleanup();
-int usb_write(usb_handle *h, const void *data, int len);
-int usb_read(usb_handle *h, void *data, int len);
-int usb_close(usb_handle *h);
-void usb_kick(usb_handle *h);
-
-/* used for USB device detection */
-#if SDB_HOST
-int is_sdb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol);
-#endif
+extern void (*usb_init)();
+extern void (*usb_cleanup)();
+extern int (*usb_write)(usb_handle *h, const void *data, int len);
+extern int (*usb_read)(usb_handle *h, void *data, size_t len);
+extern int (*usb_close)(usb_handle *h);
+extern void (*usb_kick)(usb_handle *h);
+
+/* functionfs backend */
+void ffs_usb_init();
+void ffs_usb_cleanup();
+int ffs_usb_write(usb_handle *h, const void *data, int len);
+int ffs_usb_read(usb_handle *h, void *data, size_t len);
+int ffs_usb_close(usb_handle *h);
+void ffs_usb_kick(usb_handle *h);
+
+/* kernel sdb gadget backend */
+void linux_usb_init();
+void linux_usb_cleanup();
+int linux_usb_write(usb_handle *h, const void *data, int len);
+int linux_usb_read(usb_handle *h, void *data, size_t len);
+int linux_usb_close(usb_handle *h);
+void linux_usb_kick(usb_handle *h);
unsigned host_to_le32(unsigned n);
int sdb_commandline(int argc, char **argv);
#define CS_RECOVERY 4
#define CS_NOPERM 5 /* Insufficient permissions to communicate with the device */
#define CS_SIDELOAD 6
+#define CS_PWLOCK 10
extern int HOST;
extern int SHELL_EXIT_NOTIFY_FD;
-#if !SDB_HOST
extern SdbdCommandlineArgs sdbd_commandline_args;
-#endif
#define CHUNK_SIZE (64*1024)
+#define SDBD_SHELL_CMD_MAX 4096
int sendfailmsg(int fd, const char *reason);
int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s);
+int copy_packet(apacket* dest, apacket* src);
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 USB_FUNCFS_SDB_PATH "/dev/usb-funcs/sdb/default/"
+#define USB_NODE_FILE "/dev/samsung_sdb"
+int create_subprocess(const char *cmd, pid_t *pid, char * const argv[], char * const envp[]);
+void get_env(char *key, char **env);
+
+#define RESERVE_CAPABILITIES_AFTER_FORK 0
+#define DROP_CAPABILITIES_AFTER_FORK 1
-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);
-#endif
#endif
-
-#define USB_FUNCFS_SDB_PATH "/dev/usbgadget/sdb"
-#define USB_NODE_FILE "/dev/samsung_sdb"