ref: f0f2d452c873255dec4b3359b3f93e349be0f2c5
dir: /sys/src/9/mt7688/bootargs.c/
#include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" /* store plan9.ini contents here at least until we stash them in #ec */ #define BOOTARGS ((char*)CONFADDR) #define BOOTARGSLEN (16*1024) /* limit in devenv.c */ #define MAXCONF 64 #define MAXCONFLINE 160 #define isascii(c) ((uchar)(c) > 0 && (uchar)(c) < 0177) static char confname[MAXCONF][KNAMELEN]; static char confval[MAXCONF][MAXCONFLINE]; int nconf; /* plan9.ini stuff */ static int findconf(char *name) { int i; for(i = 0; i < nconf; i++) if(cistrcmp(confname[i], name) == 0) return i; return -1; } char* getconf(char *name) { int i; i = findconf(name); if(i >= 0) return confval[i]; return nil; } static void addconf(char *name, char *val) { int i; i = findconf(name); if(i < 0){ if(val == nil || nconf >= MAXCONF) return; i = nconf++; strecpy(confname[i], confname[i]+sizeof(confname[i]), name); } // confval[i] = val; strecpy(confval[i], confval[i]+sizeof(confval[i]), val); } static void writeconf(void) { char *p, *q; int n; p = getconfenv(); if(waserror()) { free(p); nexterror(); } /* convert to name=value\n format */ for(q=p; *q; q++) { q += strlen(q); *q = '='; q += strlen(q); *q = '\n'; } n = q - p + 1; if(n >= BOOTARGSLEN) error("kernel configuration too large"); memmove(BOOTARGS, p, n); poperror(); free(p); } void setconfenv(void) { int i; for(i = 0; i < nconf; i++){ if(confname[i][0] != '*') ksetenv(confname[i], confval[i], 0); ksetenv(confname[i], confval[i], 1); } } /* * assumes that we have loaded our /cfg/pxe/mac * file at 0x10000 with tftp in u-boot. * no longer uses malloc, so can be called early. */ void plan9iniinit(void) { char *k, *v, *next; k = (char *)CONFADDR; if(!isascii(*k)) return; for(; k && *k != '\0'; k = next) { if (!isascii(*k)) /* sanity check */ break; next = strchr(k, '\n'); if (next) *next++ = '\0'; if (*k == '\0' || *k == '\n' || *k == '#') continue; v = strchr(k, '='); if(v == nil) continue; /* mal-formed line */ *v++ = '\0'; addconf(k, v); } }