1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* 2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Dropbear - a SSH2 server 3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 2002,2003 Matt Johnston 5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * All rights reserved. 6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * in the Software without restriction, including without limitation the rights 10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * furnished to do so, subject to the following conditions: 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The above copyright notice and this permission notice shall be included in 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * all copies or substantial portions of the Software. 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SOFTWARE. 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * strlcat() is copyright as follows: 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * All rights reserved. 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Redistribution and use in source and binary forms, with or without 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * modification, are permitted provided that the following conditions 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * are met: 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * notice, this list of conditions and the following disclaimer. 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * documentation and/or other materials provided with the distribution. 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 3. The name of the author may not be used to endorse or promote products 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * derived from this software without specific prior written permission. 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * daemon() and getusershell() is copyright as follows: 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 1990, 1993 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The Regents of the University of California. All rights reserved. 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Redistribution and use in source and binary forms, with or without 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * modification, are permitted provided that the following conditions 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * are met: 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * notice, this list of conditions and the following disclaimer. 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * documentation and/or other materials provided with the distribution. 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * may be used to endorse or promote products derived from this software 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * without specific prior written permission. 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project* SUCH DAMAGE. 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project* 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project* Modifications for Dropbear to getusershell() are by Paul Marinceu 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "includes.h" 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_GETUSERSHELL 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic char **curshell, **shells, *strings; 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic char **initshells(); 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_STRLCPY 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Implemented by matt as specified in freebsd 4.7 manpage. 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * We don't require great speed, is simply for use with sshpty code */ 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectsize_t strlcpy(char *dst, const char *src, size_t size) { 94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project size_t i; 96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* this is undefined, though size==0 -> return 0 */ 98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (size < 1) { 99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return 0; 100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (i = 0; i < size-1; i++) { 103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (src[i] == '\0') { 104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project break; 105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project dst[i] = src[i]; 107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project dst[i] = '\0'; 111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return strlen(src); 112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* HAVE_STRLCPY */ 115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_STRLCAT 117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* taken from openbsd-compat for OpenSSH 3.6.1p1 */ 118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* "$OpenBSD: strlcat.c,v 1.8 2001/05/13 15:40:15 deraadt Exp $" 119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Appends src to string dst of size siz (unlike strncat, siz is the 121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * full size of dst, not space left). At most siz-1 characters 122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * will be copied. Always NUL terminates (unless siz <= strlen(dst)). 123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Returns strlen(src) + MIN(siz, strlen(initial dst)). 124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * If retval >= siz, truncation occurred. 125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project size_t 127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstrlcat(dst, src, siz) 128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char *dst; 129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project const char *src; 130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project size_t siz; 131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register char *d = dst; 133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register const char *s = src; 134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register size_t n = siz; 135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project size_t dlen; 136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* Find the end of dst and adjust bytes left but don't go past end */ 138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project while (n-- != 0 && *d != '\0') 139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project d++; 140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project dlen = d - dst; 141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project n = siz - dlen; 142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (n == 0) 144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return(dlen + strlen(s)); 145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project while (*s != '\0') { 146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (n != 1) { 147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *d++ = *s; 148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project n--; 149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project s++; 151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *d = '\0'; 153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return(dlen + (s - src)); /* count does not include NUL */ 155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* HAVE_STRLCAT */ 157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_DAEMON 159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* From NetBSD - daemonise a process */ 160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint daemon(int nochdir, int noclose) { 162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int fd; 164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project switch (fork()) { 166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project case -1: 167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (-1); 168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project case 0: 169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project break; 170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project default: 171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project _exit(0); 172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (setsid() == -1) 175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return -1; 176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (!nochdir) 178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (void)chdir("/"); 179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (!noclose && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { 181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (void)dup2(fd, STDIN_FILENO); 182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (void)dup2(fd, STDOUT_FILENO); 183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (void)dup2(fd, STDERR_FILENO); 184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fd > STDERR_FILENO) 185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (void)close(fd); 186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return 0; 188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* HAVE_DAEMON */ 190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_BASENAME 192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar *basename(const char *path) { 194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char *foo = strrchr(path, '/'); 196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return ++foo; 197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* HAVE_BASENAME */ 200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_GETUSERSHELL 202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* 204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Get a list of shells from /etc/shells, if it exists. 205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar * getusershell() { 207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char *ret; 208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (curshell == NULL) 210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project curshell = initshells(); 211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ret = *curshell; 212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (ret != NULL) 213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project curshell++; 214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (ret); 215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid endusershell() { 218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (shells != NULL) 220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project free(shells); 221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project shells = NULL; 222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (strings != NULL) 223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project free(strings); 224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project strings = NULL; 225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project curshell = NULL; 226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid setusershell() { 229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project curshell = initshells(); 230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic char **initshells() { 233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* don't touch this list. */ 234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project const char *okshells[] = { "/bin/sh", "/bin/csh", NULL }; 235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register char **sp, *cp; 236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register FILE *fp; 237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project struct stat statb; 238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int flen; 239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (shells != NULL) 241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project free(shells); 242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project shells = NULL; 243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (strings != NULL) 244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project free(strings); 245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project strings = NULL; 246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((fp = fopen("/etc/shells", "rc")) == NULL) 247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (char **) okshells; 248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fstat(fileno(fp), &statb) == -1) { 249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (void)fclose(fp); 250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (char **) okshells; 251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((strings = malloc((u_int)statb.st_size + 1)) == NULL) { 253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (void)fclose(fp); 254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (char **) okshells; 255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project shells = calloc((unsigned)statb.st_size / 3, sizeof (char *)); 257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (shells == NULL) { 258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (void)fclose(fp); 259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project free(strings); 260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project strings = NULL; 261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (char **) okshells; 262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project sp = shells; 264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cp = strings; 265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project flen = statb.st_size; 266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project while (fgets(cp, flen - (cp - strings), fp) != NULL) { 267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project while (*cp != '#' && *cp != '/' && *cp != '\0') 268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cp++; 269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (*cp == '#' || *cp == '\0') 270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project continue; 271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *sp++ = cp; 272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project while (!isspace(*cp) && *cp != '#' && *cp != '\0') 273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cp++; 274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *cp++ = '\0'; 275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *sp = NULL; 277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (void)fclose(fp); 278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return (shells); 279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* HAVE_GETUSERSHELL */ 282