xref: /openbsd-src/libexec/ld.so/path.c (revision 3d8e19a1e88234ef8b946d7c79832ee657fb249a)
1*3d8e19a1Sguenther /*	$OpenBSD: path.c,v 1.8 2019/12/17 17:16:32 guenther Exp $	*/
2c8dfd7a0Skurt 
3c8dfd7a0Skurt /*
4c8dfd7a0Skurt  * Copyright (c) 2013 Kurt Miller <kurt@intricatesoftware.com>
5c8dfd7a0Skurt  *
6c8dfd7a0Skurt  * Permission to use, copy, modify, and distribute this software for any
7c8dfd7a0Skurt  * purpose with or without fee is hereby granted, provided that the above
8c8dfd7a0Skurt  * copyright notice and this permission notice appear in all copies.
9c8dfd7a0Skurt  *
10c8dfd7a0Skurt  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11c8dfd7a0Skurt  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12c8dfd7a0Skurt  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13c8dfd7a0Skurt  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14c8dfd7a0Skurt  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15c8dfd7a0Skurt  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16c8dfd7a0Skurt  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17c8dfd7a0Skurt  */
18c8dfd7a0Skurt 
19c8dfd7a0Skurt #include <sys/types.h>
20c8dfd7a0Skurt #include "path.h"
21c8dfd7a0Skurt #include "util.h"
22c8dfd7a0Skurt 
23c8dfd7a0Skurt char **
_dl_split_path(const char * searchpath)24c8dfd7a0Skurt _dl_split_path(const char *searchpath)
25c8dfd7a0Skurt {
26c8dfd7a0Skurt 	int pos = 0;
27c8dfd7a0Skurt 	int count = 1;
28c8dfd7a0Skurt 	const char *pp, *p_begin;
29c8dfd7a0Skurt 	char **retval;
30c8dfd7a0Skurt 
31c8dfd7a0Skurt 	if (searchpath == NULL)
32c8dfd7a0Skurt 		return (NULL);
33c8dfd7a0Skurt 
34c8dfd7a0Skurt 	/* Count ':' or ';' in searchpath */
35c8dfd7a0Skurt 	pp = searchpath;
36c8dfd7a0Skurt 	while (*pp) {
37c8dfd7a0Skurt 		if (*pp == ':' || *pp == ';')
38c8dfd7a0Skurt 			count++;
39c8dfd7a0Skurt 		pp++;
40c8dfd7a0Skurt 	}
41c8dfd7a0Skurt 
42c8dfd7a0Skurt 	/* one more for NULL entry */
43c8dfd7a0Skurt 	count++;
44c8dfd7a0Skurt 
45590eb4f1Sjsg 	retval = _dl_reallocarray(NULL, count, sizeof(*retval));
46c8dfd7a0Skurt 	if (retval == NULL)
47*3d8e19a1Sguenther 		_dl_oom();
48c8dfd7a0Skurt 
49c8dfd7a0Skurt 	pp = searchpath;
50c8dfd7a0Skurt 	while (pp) {
51c8dfd7a0Skurt 		p_begin = pp;
52c8dfd7a0Skurt 		while (*pp != '\0' && *pp != ':' && *pp != ';')
53c8dfd7a0Skurt 			pp++;
54c8dfd7a0Skurt 
556f60d148Sbenno 		if (p_begin != pp) {
56c8dfd7a0Skurt 			retval[pos] = _dl_malloc(pp - p_begin + 1);
57c8dfd7a0Skurt 			if (retval[pos] == NULL)
58*3d8e19a1Sguenther 				_dl_oom();
59c8dfd7a0Skurt 
60c8dfd7a0Skurt 			_dl_bcopy(p_begin, retval[pos], pp - p_begin);
61c8dfd7a0Skurt 			retval[pos++][pp - p_begin] = '\0';
62c8dfd7a0Skurt 		}
63c8dfd7a0Skurt 
646f60d148Sbenno 		if (*pp)
65c8dfd7a0Skurt 			pp++;
66c8dfd7a0Skurt 		else
67c8dfd7a0Skurt 			pp = NULL;
68c8dfd7a0Skurt 	}
69c8dfd7a0Skurt 
70c827e20bSotto 	retval[pos] = NULL;
71c8dfd7a0Skurt 	return (retval);
72c8dfd7a0Skurt }
73c8dfd7a0Skurt 
74c8dfd7a0Skurt void
_dl_free_path(char ** path)75c8dfd7a0Skurt _dl_free_path(char **path)
76c8dfd7a0Skurt {
77c8dfd7a0Skurt 	char **p = path;
78c8dfd7a0Skurt 
79c8dfd7a0Skurt 	if (path == NULL)
80c8dfd7a0Skurt 		return;
81c8dfd7a0Skurt 
82c8dfd7a0Skurt 	while (*p != NULL)
83c8dfd7a0Skurt 		_dl_free(*p++);
84c8dfd7a0Skurt 
85c8dfd7a0Skurt 	_dl_free(path);
86c8dfd7a0Skurt }
87