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