aboutsummaryrefslogtreecommitdiff
path: root/core/fs/lib/searchconfig.c
blob: bb1dabf98c24b5e067e502dc0ed8048925e32393 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <dprintf.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <core.h>
#include <fs.h>

__export char ConfigName[FILENAME_MAX];
__export char config_cwd[FILENAME_MAX];

/*
 * This searches for a specified set of filenames in a specified set
 * of directories.  If found, set the current working directory to
 * match.
 */
int search_dirs(struct com32_filedata *filedata,
		const char *search_directories[],
		const char *filenames[],
		char *realname)
{
    char namebuf[FILENAME_MAX];
    const char *sd, **sdp;
    const char *sf, **sfp;

    for (sdp = search_directories; (sd = *sdp); sdp++) {
	for (sfp = filenames; (sf = *sfp); sfp++) {
	    snprintf(namebuf, sizeof namebuf,
		     "%s%s%s",
		     sd, (*sd && sd[strlen(sd)-1] == '/') ? "" : "/",
		     sf);
	    if (realpath(realname, namebuf, FILENAME_MAX) == (size_t)-1)
		continue;
	    dprintf("Config search: %s\n", realname);
	    if (open_file(realname, O_RDONLY, filedata) >= 0) {
		chdir(sd);
		return 0;	/* Got it */
	    }
	}
    }

    return -1;
}