diff options
-rw-r--r-- | fastbootd/Android.mk | 8 | ||||
-rw-r--r-- | fastbootd/fastbootd.c | 2 | ||||
-rw-r--r-- | fastbootd/network_discovery.c | 118 | ||||
-rw-r--r-- | fastbootd/network_discovery.h | 37 | ||||
-rw-r--r-- | fastbootd/utils.c | 50 | ||||
-rw-r--r-- | fastbootd/utils.h | 2 |
6 files changed, 215 insertions, 2 deletions
diff --git a/fastbootd/Android.mk b/fastbootd/Android.mk index 063e308..c051721 100644 --- a/fastbootd/Android.mk +++ b/fastbootd/Android.mk @@ -18,6 +18,7 @@ include $(CLEAR_VARS) LOCAL_C_INCLUDES := \ external/openssl/include \ + external/mdnsresponder/mDNSShared \ $(LOCAL_PATH)/include \ external/zlib/ \ @@ -30,12 +31,13 @@ LOCAL_SRC_FILES := \ commands/virtual_partitions.c \ fastbootd.c \ protocol.c \ + network_discovery.c \ socket_client.c \ transport.c \ transport_socket.c \ trigger.c \ usb_linux_client.c \ - utils.c + utils.c \ LOCAL_MODULE := fastbootd LOCAL_MODULE_TAGS := optional @@ -44,7 +46,9 @@ LOCAL_LDFLAGS := -ldl LOCAL_SHARED_LIBRARIES := \ libhardware \ - libhardware_legacy + libcrypto \ + libhardware_legacy \ + libmdnssd LOCAL_STATIC_LIBRARIES := \ libsparse_static \ diff --git a/fastbootd/fastbootd.c b/fastbootd/fastbootd.c index 264b6f5..66f5fca 100644 --- a/fastbootd/fastbootd.c +++ b/fastbootd/fastbootd.c @@ -30,6 +30,7 @@ void commands_init(); void usb_init(); void config_init(); int transport_socket_init(); +int network_discovery_init(); int main(int argc, char **argv) { @@ -76,6 +77,7 @@ int main(int argc, char **argv) usb_init(); if (!transport_socket_init()) exit(1); + network_discovery_init(); while (1) { sleep(1); } diff --git a/fastbootd/network_discovery.c b/fastbootd/network_discovery.c new file mode 100644 index 0000000..1cd3e48 --- /dev/null +++ b/fastbootd/network_discovery.c @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2009-2013, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google, Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <stdio.h> +#include <string.h> +#include <dns_sd.h> +#include <cutils/properties.h> +#include <unistd.h> + +#include "debug.h" +#include "network_discovery.h" +#include "utils.h" + +#define MDNS_SERVICE_NAME "mdnsd" +#define MDNS_SERVICE_STATUS "init.svc.mdnsd" +#define FASTBOOTD_TYPE "_fastbootd._tcp" +#define FASTBOOTD_DOMAIN "local." +#define FASTBOOTD_NAME "fastbootd" + + +static void reg_reply(DNSServiceRef sdref, const DNSServiceFlags flags, DNSServiceErrorType errorCode, + const char *name, const char *regtype, const char *domain, void *context) +{ + (void)sdref; // Unused + (void)flags; // Unused + (void)context; // Unused + if (errorCode == kDNSServiceErr_ServiceNotRunning) { + fprintf(stderr, "Error code %d\n", errorCode); + } + + + printf("Got a reply for service %s.%s%s: ", name, regtype, domain); + + if (errorCode == kDNSServiceErr_NoError) + { + if (flags & kDNSServiceFlagsAdd) + printf("Name now registered and active\n"); + else + printf("Name registration removed\n"); + if (errorCode == kDNSServiceErr_NameConflict) + printf("Name in use, please choose another\n"); + else + printf("Error %d\n", errorCode); + + if (!(flags & kDNSServiceFlagsMoreComing)) fflush(stdout); + } +} + +static int register_service() { + DNSServiceRef sdref = NULL; + const char *domain = FASTBOOTD_DOMAIN; + const char *type = FASTBOOTD_TYPE; + const char *host = NULL; + char name[PROP_VALUE_MAX]; + uint16_t port = 22; + int flags = 0; + DNSServiceErrorType result; + property_get("ro.serialno", name, ""); + if (!strcmp(name, "")) { + D(ERR, "No property serialno"); + return -1; + } + + result = DNSServiceRegister(&sdref, flags, kDNSServiceInterfaceIndexAny, + name, type, domain, host, port, + 0, NULL, reg_reply, NULL); + if (result != kDNSServiceErr_NoError) { + D(ERR, "Unable to register service"); + return -1; + } + return 0; +} + + +int network_discovery_init() +{ + D(INFO, "Starting discovery"); + if (service_start(MDNS_SERVICE_NAME)) { + D(ERR, "Unable to start discovery"); + return -1; + } + + if (register_service()) { + D(ERR, "Unable to register service"); + return -1; + } + + return 0; +} + diff --git a/fastbootd/network_discovery.h b/fastbootd/network_discovery.h new file mode 100644 index 0000000..75fda63 --- /dev/null +++ b/fastbootd/network_discovery.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2009-2013, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google, Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _FASTBOOTD_NETWORK_DISCOVERY_H +#define _FASTBOOTD_NETWORK_DISCOVERY_H + +int network_discovery_init(); + +#endif diff --git a/fastbootd/utils.c b/fastbootd/utils.c index cac5509..22f5775 100644 --- a/fastbootd/utils.c +++ b/fastbootd/utils.c @@ -35,6 +35,7 @@ #include <sys/ioctl.h> #include <linux/fs.h> #include <stdlib.h> +#include <cutils/properties.h> #include "utils.h" #include "debug.h" @@ -204,3 +205,52 @@ ssize_t bulk_read(int bulk_out, char *buf, size_t length) return n; } +#define NAP_TIME 200 // 200 ms between polls +static int wait_for_property(const char *name, const char *desired_value, int maxwait) +{ + char value[PROPERTY_VALUE_MAX] = {'\0'}; + int maxnaps = (maxwait * 1000) / NAP_TIME; + + if (maxnaps < 1) { + maxnaps = 1; + } + + while (maxnaps-- > 0) { + usleep(NAP_TIME * 1000); + if (property_get(name, value, NULL)) { + if (desired_value == NULL || strcmp(value, desired_value) == 0) { + return 0; + } + } + } + return -1; /* failure */ +} + +int service_start(const char *service_name) +{ + int result = 0; + char property_value[PROPERTY_VALUE_MAX]; + + property_get(service_name, property_value, ""); + if (strcmp("running", property_value) != 0) { + D(INFO, "Starting MDNSD"); + property_set("ctl.start", service_name); + if (wait_for_property(service_name, "running", 5)) + result = -1; + } + + return result; +} + +int service_stop(const char *service_name) +{ + int result = 0; + + D(INFO, "Stopping MDNSD"); + property_set("ctl.stop", service_name); + if (wait_for_property(service_name, "stopped", 5)) + result = -1; + + return result; +} + diff --git a/fastbootd/utils.h b/fastbootd/utils.h index c714786..40c17c1 100644 --- a/fastbootd/utils.h +++ b/fastbootd/utils.h @@ -45,6 +45,8 @@ int wipe_block_device(int fd, int64_t len); int create_temp_file(); ssize_t bulk_read(int bulk_out, char *buf, size_t length); ssize_t bulk_write(int bulk_in, const char *buf, size_t length); +int service_start(const char *service_name); +int service_stop(const char *service_name); #define ROUND_TO_PAGE(address,pagesize) ((address + pagesize - 1) & (~(pagesize - 1))) |