1*dd3c9d24Sclaudio /* $OpenBSD: misc.c,v 1.3 2021/05/17 12:02:58 claudio Exp $ */
24d864e8fSderaadt /*
34d864e8fSderaadt * Copyright (c) 2000 Markus Friedl. All rights reserved.
44d864e8fSderaadt * Copyright (c) 2005,2006 Damien Miller. All rights reserved.
54d864e8fSderaadt *
64d864e8fSderaadt * Redistribution and use in source and binary forms, with or without
74d864e8fSderaadt * modification, are permitted provided that the following conditions
84d864e8fSderaadt * are met:
94d864e8fSderaadt * 1. Redistributions of source code must retain the above copyright
104d864e8fSderaadt * notice, this list of conditions and the following disclaimer.
114d864e8fSderaadt * 2. Redistributions in binary form must reproduce the above copyright
124d864e8fSderaadt * notice, this list of conditions and the following disclaimer in the
134d864e8fSderaadt * documentation and/or other materials provided with the distribution.
144d864e8fSderaadt *
154d864e8fSderaadt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
164d864e8fSderaadt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
174d864e8fSderaadt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
184d864e8fSderaadt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
194d864e8fSderaadt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
204d864e8fSderaadt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
214d864e8fSderaadt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
224d864e8fSderaadt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
234d864e8fSderaadt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
244d864e8fSderaadt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
254d864e8fSderaadt */
264d864e8fSderaadt
274d864e8fSderaadt #include <stdlib.h>
284d864e8fSderaadt #include <unistd.h>
294d864e8fSderaadt #include <stdio.h>
304d864e8fSderaadt #include <stdarg.h>
314d864e8fSderaadt #include <err.h>
324d864e8fSderaadt
334d864e8fSderaadt #include "extern.h"
344d864e8fSderaadt
354d864e8fSderaadt /* function to assist building execv() arguments */
364d864e8fSderaadt void
addargs(arglist * args,const char * fmt,...)373a011501Sclaudio addargs(arglist *args, const char *fmt, ...)
384d864e8fSderaadt {
394d864e8fSderaadt va_list ap;
404d864e8fSderaadt char *cp;
414d864e8fSderaadt u_int nalloc;
424d864e8fSderaadt int r;
434d864e8fSderaadt
444d864e8fSderaadt va_start(ap, fmt);
454d864e8fSderaadt r = vasprintf(&cp, fmt, ap);
464d864e8fSderaadt va_end(ap);
474d864e8fSderaadt if (r == -1)
48*dd3c9d24Sclaudio err(ERR_NOMEM, "addargs: argument too long");
494d864e8fSderaadt
504d864e8fSderaadt nalloc = args->nalloc;
514d864e8fSderaadt if (args->list == NULL) {
524d864e8fSderaadt nalloc = 32;
534d864e8fSderaadt args->num = 0;
544d864e8fSderaadt } else if (args->num+2 >= nalloc)
554d864e8fSderaadt nalloc *= 2;
564d864e8fSderaadt
57*dd3c9d24Sclaudio args->list = recallocarray(args->list, args->nalloc, nalloc,
58*dd3c9d24Sclaudio sizeof(char *));
594d864e8fSderaadt if (!args->list)
60*dd3c9d24Sclaudio err(ERR_NOMEM, NULL);
614d864e8fSderaadt args->nalloc = nalloc;
624d864e8fSderaadt args->list[args->num++] = cp;
634d864e8fSderaadt args->list[args->num] = NULL;
644d864e8fSderaadt }
654d864e8fSderaadt
664d864e8fSderaadt void
freeargs(arglist * args)674d864e8fSderaadt freeargs(arglist *args)
684d864e8fSderaadt {
694d864e8fSderaadt u_int i;
704d864e8fSderaadt
714d864e8fSderaadt if (args->list != NULL) {
724d864e8fSderaadt for (i = 0; i < args->num; i++)
734d864e8fSderaadt free(args->list[i]);
744d864e8fSderaadt free(args->list);
754d864e8fSderaadt args->nalloc = args->num = 0;
764d864e8fSderaadt args->list = NULL;
774d864e8fSderaadt }
784d864e8fSderaadt }
79