xref: /openbsd-src/usr.bin/rsync/misc.c (revision dd3c9d240a3d0c8e4718db3935768d953e47b2d9)
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