summaryrefslogtreecommitdiff
path: root/sys/kern/subr_hints.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/subr_hints.c')
-rw-r--r--sys/kern/subr_hints.c55
1 files changed, 40 insertions, 15 deletions
diff --git a/sys/kern/subr_hints.c b/sys/kern/subr_hints.c
index a201fa039a3d..9e04ef151ce6 100644
--- a/sys/kern/subr_hints.c
+++ b/sys/kern/subr_hints.c
@@ -35,6 +35,8 @@
*/
extern char static_hints[]; /* by config for now */
+extern int hintmode; /* 0 = off. 1 = config, 2 = fallback */
+static char *hintp;
/*
* Evil wildcarding resource string lookup.
@@ -42,7 +44,7 @@ extern char static_hints[]; /* by config for now */
* The start point can be remembered for incremental searches.
*/
static int
-res_find(const char *cp, int *line, int *startln,
+res_find(int *line, int *startln,
const char *name, int *unit, const char *resname, const char *value,
const char **ret_name, int *ret_namelen, int *ret_unit,
const char **ret_resname, int *ret_resnamelen, const char **ret_value)
@@ -52,9 +54,43 @@ res_find(const char *cp, int *line, int *startln,
int r_unit;
char r_resname[32];
char r_value[128];
- const char *s;
+ const char *s, *cp;
char *p;
+ if (hintp == NULL) {
+ switch (hintmode) {
+ case 0: /* config supplied nothing */
+ hintp = kern_envp;
+ break;
+ case 1: /* static hints only */
+ hintp = static_hints;
+ break;
+ case 2: /* fallback mode */
+ cp = kern_envp;
+ while (cp) {
+ if (strncmp(cp, "hint.", 5) == 0) {
+ cp = NULL;
+ hintp = kern_envp;
+ break;
+ }
+ while (*cp != '\0')
+ cp++;
+ cp++;
+ if (*cp == '\0') {
+ cp = NULL;
+ hintp = static_hints;
+ break;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ if (hintp == NULL)
+ hintp = kern_envp;
+ }
+
+ cp = hintp;
while (cp) {
hit = 1;
(*line)++;
@@ -133,12 +169,7 @@ resource_find(int *line, int *startln,
*line = 0;
/* Search for exact unit matches first */
- i = res_find(kern_envp, line, startln, name, unit, resname, value,
- ret_name, ret_namelen, ret_unit, ret_resname, ret_resnamelen,
- ret_value);
- if (i == 0)
- return 0;
- i = res_find(static_hints, line, startln, name, unit, resname, value,
+ i = res_find(line, startln, name, unit, resname, value,
ret_name, ret_namelen, ret_unit, ret_resname, ret_resnamelen,
ret_value);
if (i == 0)
@@ -147,13 +178,7 @@ resource_find(int *line, int *startln,
return ENOENT;
/* If we are still here, search for wildcard matches */
un = -1;
- i = res_find(kern_envp, line, startln, name, &un, resname, value,
- ret_name, ret_namelen, ret_unit, ret_resname, ret_resnamelen,
- ret_value);
- if (i == 0)
- return 0;
- un = -1;
- i = res_find(static_hints, line, startln, name, &un, resname, value,
+ i = res_find(line, startln, name, &un, resname, value,
ret_name, ret_namelen, ret_unit, ret_resname, ret_resnamelen,
ret_value);
if (i == 0)