140
140
addargs(arglist *args, char *fmt, ...)
146
147
va_start(ap, fmt);
147
vsnprintf(buf, sizeof(buf), fmt, ap);
148
r = vasprintf(&cp, fmt, ap);
151
fatal("addargs: argument too long");
150
153
nalloc = args->nalloc;
151
154
if (args->list == NULL) {
157
160
args->list = xrealloc(args->list, nalloc * sizeof(char *));
158
161
args->nalloc = nalloc;
159
args->list[args->num++] = xstrdup(buf);
162
args->list[args->num++] = cp;
160
163
args->list[args->num] = NULL;
167
replacearg(arglist *args, u_int which, char *fmt, ...)
174
r = vasprintf(&cp, fmt, ap);
177
fatal("replacearg: argument too long");
179
if (which >= args->num)
180
fatal("replacearg: tried to replace invalid arg %d >= %d",
182
xfree(args->list[which]);
183
args->list[which] = cp;
187
freeargs(arglist *args)
191
if (args->list != NULL) {
192
for (i = 0; i < args->num; i++)
193
xfree(args->list[i]);
195
args->nalloc = args->num = 0;
201
* NB. duplicate __progname in case it is an alias for argv[0]
202
* Otherwise it may get clobbered by setproctitle()
204
char *ssh_get_progname(char *argv0)
209
return ("unknown"); /* XXX */
210
p = strrchr(argv0, '/');
219
void fatal(char* fmt,...)
223
vfprintf(stderr, fmt, args);
233
if ((nullfd = dupfd = open(_PATH_DEVNULL, O_RDWR)) == -1) {
234
fprintf(stderr, "Couldn't open /dev/null: %s", strerror(errno));
237
while (++dupfd <= 2) {
238
/* Only clobber closed fds */
239
if (fcntl(dupfd, F_GETFL, 0) >= 0)
241
if (dup2(nullfd, dupfd) == -1) {
242
fprintf(stderr, "dup2: %s", strerror(errno));