176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <dprintf.h>
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <fcntl.h>
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h>
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h>
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <core.h>
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <fs.h>
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__export char ConfigName[FILENAME_MAX];
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__export char config_cwd[FILENAME_MAX];
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This searches for a specified set of filenames in a specified set
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * of directories.  If found, set the current working directory to
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * match.
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint search_dirs(struct com32_filedata *filedata,
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		const char *search_directories[],
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		const char *filenames[],
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		char *realname)
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    char namebuf[FILENAME_MAX];
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    const char *sd, **sdp;
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    const char *sf, **sfp;
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    for (sdp = search_directories; (sd = *sdp); sdp++) {
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	for (sfp = filenames; (sf = *sfp); sfp++) {
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    snprintf(namebuf, sizeof namebuf,
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		     "%s%s%s",
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		     sd, (*sd && sd[strlen(sd)-1] == '/') ? "" : "/",
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		     sf);
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    if (realpath(realname, namebuf, FILENAME_MAX) == (size_t)-1)
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		continue;
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    dprintf("Config search: %s\n", realname);
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    if (open_file(realname, O_RDONLY, filedata) >= 0) {
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		chdir(sd);
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return 0;	/* Got it */
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    }
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return -1;
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
43