1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* 2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 2000 Markus Friedl. All rights reserved. 3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Redistribution and use in source and binary forms, with or without 5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * modification, are permitted provided that the following conditions 6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * are met: 7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * notice, this list of conditions and the following disclaimer. 9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * documentation and/or other materials provided with the distribution. 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*RCSID("OpenBSD: misc.c,v 1.22 2003/09/18 08:49:45 markus Exp ");*/ 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* For xmalloc, xfree etc: 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Author: Tatu Ylonen <ylo@cs.hut.fi> 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * All rights reserved 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Versions of malloc and friends that check their results, and never return 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * failure (they call fatal if they encounter an error). 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * As far as I am concerned, the code I have written for this software 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * can be used freely for any purpose. Any derived versions of this 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * software must be clearly marked as such, and if the derived work is 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * incompatible with the protocol description in the RFC file, it must be 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * called by a name other than "ssh" or "Secure Shell". 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*RCSID("OpenBSD: xmalloc.c,v 1.16 2001/07/23 18:21:46 stevesk Exp ");*/ 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "includes.h" 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "scpmisc.h" 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid * 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectxmalloc(size_t size) 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *ptr; 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (size == 0) { 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "xmalloc: zero size\n"); 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(EXIT_FAILURE); 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ptr = malloc(size); 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (ptr == NULL) { 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "xmalloc: out of memory (allocating %lu bytes)\n", (u_long) size); 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(EXIT_FAILURE); 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return ptr; 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid * 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectxrealloc(void *ptr, size_t new_size) 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *new_ptr; 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (new_size == 0) { 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "xrealloc: zero size\n"); 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(EXIT_FAILURE); 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (ptr == NULL) 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project new_ptr = malloc(new_size); 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project else 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project new_ptr = realloc(ptr, new_size); 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (new_ptr == NULL) { 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "xrealloc: out of memory (new_size %lu bytes)\n", (u_long) new_size); 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(EXIT_FAILURE); 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return new_ptr; 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectxfree(void *ptr) 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (ptr == NULL) { 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "xfree: NULL pointer given as argument\n"); 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(EXIT_FAILURE); 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project free(ptr); 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar * 94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectxstrdup(const char *str) 95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project size_t len; 97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char *cp; 98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project len = strlen(str) + 1; 100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cp = xmalloc(len); 101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project strncpy(cp, str, len); 102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return cp; 103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar * 106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectcleanhostname(char *host) 107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (*host == '[' && host[strlen(host) - 1] == ']') { 109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project host[strlen(host) - 1] = '\0'; 110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (host + 1); 111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else 112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return host; 113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar * 116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectcolon(char *cp) 117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int flag = 0; 119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (*cp == ':') /* Leading colon is part of file name. */ 121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (0); 122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (*cp == '[') 123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project flag = 1; 124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (; *cp; ++cp) { 126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (*cp == '@' && *(cp+1) == '[') 127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project flag = 1; 128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (*cp == ']' && *(cp+1) == ':' && flag) 129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (cp+1); 130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (*cp == ':' && !flag) 131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (cp); 132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (*cp == '/') 133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (0); 134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (0); 136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* function to assist building execv() arguments */ 139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid 140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectaddargs(arglist *args, char *fmt, ...) 141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project va_list ap; 143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char *cp; 144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project u_int nalloc; 145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int r; 146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project va_start(ap, fmt); 148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project r = vasprintf(&cp, fmt, ap); 149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project va_end(ap); 150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (r == -1) 151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fatal("addargs: argument too long"); 152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project nalloc = args->nalloc; 154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (args->list == NULL) { 155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project nalloc = 32; 156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project args->num = 0; 157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else if (args->num+2 >= nalloc) 158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project nalloc *= 2; 159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project args->list = xrealloc(args->list, nalloc * sizeof(char *)); 161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project args->nalloc = nalloc; 162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project args->list[args->num++] = cp; 163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project args->list[args->num] = NULL; 164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid 167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectreplacearg(arglist *args, u_int which, char *fmt, ...) 168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project va_list ap; 170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char *cp; 171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int r; 172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project va_start(ap, fmt); 174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project r = vasprintf(&cp, fmt, ap); 175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project va_end(ap); 176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (r == -1) 177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fatal("replacearg: argument too long"); 178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (which >= args->num) 180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fatal("replacearg: tried to replace invalid arg %d >= %d", 181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project which, args->num); 182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project xfree(args->list[which]); 183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project args->list[which] = cp; 184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid 187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectfreeargs(arglist *args) 188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project u_int i; 190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (args->list != NULL) { 192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (i = 0; i < args->num; i++) 193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project xfree(args->list[i]); 194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project xfree(args->list); 195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project args->nalloc = args->num = 0; 196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project args->list = NULL; 197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* 201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * NB. duplicate __progname in case it is an alias for argv[0] 202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Otherwise it may get clobbered by setproctitle() 203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar *ssh_get_progname(char *argv0) 205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char *p; 207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (argv0 == NULL) 209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return ("unknown"); /* XXX */ 210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project p = strrchr(argv0, '/'); 211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (p == NULL) 212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project p = argv0; 213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project else 214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project p++; 215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (xstrdup(p)); 217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid fatal(char* fmt,...) 220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project va_list args; 222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project va_start(args, fmt); 223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project vfprintf(stderr, fmt, args); 224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project va_end(args); 225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(255); 226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid 229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectsanitise_stdfd(void) 230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int nullfd, dupfd; 232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((nullfd = dupfd = open(_PATH_DEVNULL, O_RDWR)) == -1) { 234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "Couldn't open /dev/null: %s", strerror(errno)); 235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(1); 236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project while (++dupfd <= 2) { 238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* Only clobber closed fds */ 239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fcntl(dupfd, F_GETFL, 0) >= 0) 240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project continue; 241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (dup2(nullfd, dupfd) == -1) { 242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "dup2: %s", strerror(errno)); 243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(1); 244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (nullfd > 2) 247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project close(nullfd); 248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 249