1a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross/* 2a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * Copyright (c) 2013, Google Inc. 3a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * All rights reserved. 4a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * 5a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * Redistribution and use in source and binary forms, with or without 6a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * modification, are permitted provided that the following conditions 7a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * are met: 8a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * * Redistributions of source code must retain the above copyright 9a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * notice, this list of conditions and the following disclaimer. 10a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * * Redistributions in binary form must reproduce the above copyright 11a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * notice, this list of conditions and the following disclaimer in 12a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * the documentation and/or other materials provided with the 13a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * distribution. 14a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * * Neither the name of Google, Inc. nor the names of its contributors 15a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * may be used to endorse or promote products derived from this 16a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * software without specific prior written permission. 17a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * 18a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 25a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross * SUCH DAMAGE. 30a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross */ 31a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 32a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross#include <fcntl.h> 33a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross#include <string.h> 34a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross#include <unistd.h> 35a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross#include <sys/types.h> 36a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 37a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross#include "protocol.h" 38e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki#include "utils.h" 39a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 40a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross#include "debug.h" 41a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 42a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross// TODO: change config path 43a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross#define CONFIG_PATH "/data/fastboot.cfg" 44a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 45a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Crossstatic int config_parse_line(char *line) 46a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross{ 47a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross char *c; 48a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross char *key; 49a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross char *value; 50a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 51a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross c = strchr(line, '#'); 52a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (c) 53a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross *c = '\0'; 54a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 55a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (strspn(line, " \t") == strlen(line)) 56a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross return 0; 57a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 58a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross c = strchr(line, '='); 59a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (c == NULL) 60a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross return -1; 61a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 62a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross key = line; 63a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross *c = '\0'; 64a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross value = c + 1; 65a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 66a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross key = strip(key); 67a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross value = strip(value); 68a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 69a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross key = strdup(key); 70a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross value = strdup(value); 71a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 72a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross fastboot_publish(key, value); 73a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 74a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross return 0; 75a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross} 76a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 77a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Crossstatic void config_parse(char *buffer) 78a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross{ 79a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross char *saveptr; 80a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross char *str = buffer; 81a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross char *line = buffer; 82a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross int c; 83a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross int ret; 84a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 85a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross for (c = 1; line != NULL; c++) { 86a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross line = strtok_r(str, "\r\n", &saveptr); 87a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (line != NULL) { 88a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross D(VERBOSE, "'%s'", line); 89a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross ret = config_parse_line(line); 90a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (ret < 0) { 91a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross D(WARN, "error parsing " CONFIG_PATH " line %d", c); 92a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross } 93a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross } 94a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross str = NULL; 95a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross } 96a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross} 97a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 98a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Crossvoid config_init() 99a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross{ 100a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross int fd; 101a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross off_t len; 102a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross ssize_t ret; 103a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross size_t count = 0; 104a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross char *buffer; 105a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 106a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross fd = open(CONFIG_PATH, O_RDONLY); 107a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (fd < 0) { 108a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross D(ERR, "failed to open " CONFIG_PATH); 109a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross return; 110a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross } 111a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 112a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross len = lseek(fd, 0, SEEK_END); 113a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (len < 0) { 114a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross D(ERR, "failed to seek to end of " CONFIG_PATH); 115a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross return; 116a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross } 117a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 118a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross lseek(fd, 0, SEEK_SET); 119a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 120a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross buffer = malloc(len + 1); 121a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (buffer == NULL) { 122a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross D(ERR, "failed to allocate %ld bytes", len); 123a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross return; 124a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross } 125a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 126a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross while (count < (size_t)len) { 127a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross ret = read(fd, buffer + count, len - count); 128a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (ret < 0 && errno != EINTR) { 129a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross D(ERR, "failed to read " CONFIG_PATH ": %d %s", errno, strerror(errno)); 130a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross return; 131a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross } 132a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross if (ret == 0) { 133a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross D(ERR, "early EOF reading " CONFIG_PATH); 134a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross return; 135a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross } 136a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 137a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross count += ret; 138a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross } 139a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 140a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross buffer[len] = '\0'; 141a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 142a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross config_parse(buffer); 143a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross 144a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross free(buffer); 145a3d386ea56ef53bb070b87ea7c28e103c5a53e45Colin Cross} 146