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