1f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* 2f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * dhcpcd - DHCP client daemon 3a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt * Copyright (c) 2006-2012 Roy Marples <roy@marples.name> 4f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * All rights reserved 5f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 6f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * Redistribution and use in source and binary forms, with or without 7f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * modification, are permitted provided that the following conditions 8f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * are met: 9f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 10f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * notice, this list of conditions and the following disclaimer. 11f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 12f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 13f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * documentation and/or other materials provided with the distribution. 14f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * 15f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * SUCH DAMAGE. 26f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project */ 27f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 28e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt/* Needed define to get at getline for glibc and FreeBSD */ 29e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#ifndef _GNU_SOURCE 30e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt# define _GNU_SOURCE 31e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#endif 32e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt 33e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include <sys/cdefs.h> 34e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt 35f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#ifdef __APPLE__ 36f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project# include <mach/mach_time.h> 37f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project# include <mach/kern_return.h> 38f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#endif 39f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 40f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <sys/param.h> 41f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <sys/time.h> 42f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 43f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <errno.h> 44f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <fcntl.h> 45e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include <limits.h> 46f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#ifdef BSD 47f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project# include <paths.h> 48f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#endif 49f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <stdint.h> 50f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <stdio.h> 51f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <stdlib.h> 52f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <string.h> 53e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include <syslog.h> 54f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <time.h> 55f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <unistd.h> 56f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 57f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include "common.h" 58f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 59f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#ifndef _PATH_DEVNULL 60f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project# define _PATH_DEVNULL "/dev/null" 61f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#endif 62f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 63e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtint clock_monotonic; 64e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtstatic char *lbuf; 65e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtstatic size_t lbuf_len; 66e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#ifdef DEBUG_MEMORY 67e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtstatic char lbuf_set; 68f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#endif 69f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 70e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#ifdef DEBUG_MEMORY 71e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtstatic void 72e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtfree_lbuf(void) 73f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 74e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt free(lbuf); 75e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt lbuf = NULL; 76f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 77f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#endif 78f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 79e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt/* Handy routine to read very long lines in text files. 80e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * This means we read the whole line and avoid any nasty buffer overflows. 81e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * We strip leading space and avoid comment lines, making the code that calls 82e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * us smaller. 83e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * As we don't use threads, this API is clean too. */ 84e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtchar * 85e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtget_line(FILE * __restrict fp) 86f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 87e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt char *p; 88e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt ssize_t bytes; 89f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 90e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#ifdef DEBUG_MEMORY 91e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if (lbuf_set == 0) { 92e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt atexit(free_lbuf); 93e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt lbuf_set = 1; 94e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt } 95f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#endif 96f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 97e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt do { 98e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt bytes = getline(&lbuf, &lbuf_len, fp); 99e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if (bytes == -1) 100e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt return NULL; 101e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt for (p = lbuf; *p == ' ' || *p == '\t'; p++) 102e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt ; 103e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt } while (*p == '\0' || *p == '\n' || *p == '#' || *p == ';'); 104e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if (lbuf[--bytes] == '\n') 105e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt lbuf[bytes] = '\0'; 106e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt return p; 107f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 108f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 109f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectint 110f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectset_cloexec(int fd) 111f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 112f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project int flags; 113f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 114e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if ((flags = fcntl(fd, F_GETFD, 0)) == -1 || 115e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) 116f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project { 117e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt syslog(LOG_ERR, "fcntl: %m"); 118f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return -1; 119f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 120f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return 0; 121f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 122f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 123f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectint 124f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectset_nonblock(int fd) 125f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 126f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project int flags; 127f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 128e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if ((flags = fcntl(fd, F_GETFL, 0)) == -1 || 129e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) 130f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project { 131e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt syslog(LOG_ERR, "fcntl: %m"); 132f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return -1; 133f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 134f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return 0; 135f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 136f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 137f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* Handy function to get the time. 138f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * We only care about time advancements, not the actual time itself 139f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * Which is why we use CLOCK_MONOTONIC, but it is not available on all 140f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * platforms. 141f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project */ 142f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define NO_MONOTONIC "host does not support a monotonic clock - timing can skew" 143f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectint 144f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectget_monotonic(struct timeval *tp) 145f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 146f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project static int posix_clock_set = 0; 147f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#if defined(_POSIX_MONOTONIC_CLOCK) && defined(CLOCK_MONOTONIC) 148f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project struct timespec ts; 149f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project static clockid_t posix_clock; 150f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 151e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if (!posix_clock_set) { 152f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { 153f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project posix_clock = CLOCK_MONOTONIC; 154938bc384f44031877543765a9ae18c764f5da9c8Dmitry Shmidt clock_monotonic = posix_clock_set = 1; 155f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 156f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 157f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 158f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (clock_monotonic) { 159f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (clock_gettime(posix_clock, &ts) == 0) { 160f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project tp->tv_sec = ts.tv_sec; 161f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project tp->tv_usec = ts.tv_nsec / 1000; 162f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return 0; 163f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 164f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 165f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#elif defined(__APPLE__) 166f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define NSEC_PER_SEC 1000000000 167f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project /* We can use mach kernel functions here. 168f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * This is crap though - why can't they implement clock_gettime?*/ 169f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project static struct mach_timebase_info info = { 0, 0 }; 170f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project static double factor = 0.0; 171f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint64_t nano; 172f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project long rem; 173f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 174e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if (!posix_clock_set) { 175f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (mach_timebase_info(&info) == KERN_SUCCESS) { 176f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project factor = (double)info.numer / (double)info.denom; 177938bc384f44031877543765a9ae18c764f5da9c8Dmitry Shmidt clock_monotonic = posix_clock_set = 1; 178f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 179f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 180f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (clock_monotonic) { 181f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project nano = mach_absolute_time(); 182f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if ((info.denom != 1 || info.numer != 1) && factor != 0.0) 183f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project nano *= factor; 184f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project tp->tv_sec = nano / NSEC_PER_SEC; 185f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project rem = nano % NSEC_PER_SEC; 186f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (rem < 0) { 187f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project tp->tv_sec--; 188f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project rem += NSEC_PER_SEC; 189f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 190f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project tp->tv_usec = rem / 1000; 191f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return 0; 192f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 193f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#endif 194f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 195f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project /* Something above failed, so fall back to gettimeofday */ 196f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (!posix_clock_set) { 197e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt syslog(LOG_WARNING, NO_MONOTONIC); 198f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project posix_clock_set = 1; 199f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project } 200f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return gettimeofday(tp, NULL); 201f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 202f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 203a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtssize_t 204a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtsetvar(char ***e, const char *prefix, const char *var, const char *value) 205a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt{ 206a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt size_t len = strlen(var) + strlen(value) + 3; 207a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt 208a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt if (prefix) 209a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt len += strlen(prefix) + 1; 210a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt **e = xmalloc(len); 211a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt if (prefix) 212a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt snprintf(**e, len, "%s_%s=%s", prefix, var, value); 213a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt else 214a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt snprintf(**e, len, "%s=%s", var, value); 215a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt (*e)++; 216a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt return len; 217a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt} 218a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt 219a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtssize_t 220a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtsetvard(char ***e, const char *prefix, const char *var, int value) 221a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt{ 222a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt char buffer[32]; 223a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt 224a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt snprintf(buffer, sizeof(buffer), "%d", value); 225a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt return setvar(e, prefix, var, buffer); 226a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt} 227a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt 228a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt 229f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projecttime_t 230f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectuptime(void) 231f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 232f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project struct timeval tv; 233f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 234f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (get_monotonic(&tv) == -1) 235f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return -1; 236f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return tv.tv_sec; 237f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 238f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 239f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectint 240f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectwritepid(int fd, pid_t pid) 241f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 242f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project char spid[16]; 243f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project ssize_t len; 244f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 245f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (ftruncate(fd, (off_t)0) == -1) 246f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return -1; 247f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project snprintf(spid, sizeof(spid), "%u\n", pid); 248f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project len = pwrite(fd, spid, strlen(spid), (off_t)0); 249f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project if (len != (ssize_t)strlen(spid)) 250f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return -1; 251f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return 0; 252f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 253f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 254f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectvoid * 255f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectxmalloc(size_t s) 256f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 257f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project void *value = malloc(s); 258f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 259e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if (value != NULL) 260f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return value; 261e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt syslog(LOG_ERR, "memory exhausted (xalloc %zu bytes)", s); 262f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project exit (EXIT_FAILURE); 263f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project /* NOTREACHED */ 264f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 265f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 266f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectvoid * 267f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectxzalloc(size_t s) 268f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 269f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project void *value = xmalloc(s); 270f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 271f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project memset(value, 0, s); 272f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return value; 273f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 274f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 275f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectvoid * 276f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectxrealloc(void *ptr, size_t s) 277f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 278f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project void *value = realloc(ptr, s); 279f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 280e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if (value != NULL) 281e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt return value; 282e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt syslog(LOG_ERR, "memory exhausted (xrealloc %zu bytes)", s); 283f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project exit(EXIT_FAILURE); 284f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project /* NOTREACHED */ 285f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 286f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 287f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectchar * 288f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectxstrdup(const char *str) 289f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 290f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project char *value; 291f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 292e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if (str == NULL) 293f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return NULL; 294f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 295e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt if ((value = strdup(str)) != NULL) 296f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project return value; 297f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 298e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt syslog(LOG_ERR, "memory exhausted (xstrdup)"); 299f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project exit(EXIT_FAILURE); 300f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project /* NOTREACHED */ 301f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project} 302