libk  boot.rt.c at [c231d33808]

File mod/kcore/boot.rt.c artifact 298efe4468 part of check-in c231d33808


#include <k/core.h>
#include <k/type.h>
extern stat entry(kenv);

const char* _k_internal_binary_name;

unsigned long long
_boot(unsigned int argc, /* argument count */
		const char** argv, /* arguments */
		char** envp /* environment */ ) {

	_k_internal_binary_name = argv[0];

	char** ep;
	/* advance ep until it points at the last element */
	for (ep = envp; *ep != 0; ++ep);

	/* allocate space for each environment variable */
	kvar variables [ep - envp];

	for (char** v = envp; *v != 0; ++v) {
		kvar* var = variables + (v - envp);
		var -> name.ptr = *v;
		char* i = *v;
		for(;*i != '=';++i);
		var -> name.size = i - *v;
		var -> val.ptr = i + 1;
		for(;*i != 0;++i);

		/* there is probably a better way to do this; my
		 * brain is too foggy to figure one out tho */
		var -> val.size = (i - *v) - var -> name.size;
	}

	kenv e = { 
		/* TODO: determine terminal class and set term vs ansi correctly! */
		{ {kiostream_term, 0}, {kiostream_term, 1} }, // chan std
		{ {kiostream_closed},  {kiostream_term, 2} }, // chan err
		argc, argv, ep - envp, variables
	};

	return entry(e);
}