xref: /inferno-os/appl/lib/env.b (revision 9b29ac7ea714507a9c0690620c02c8ca5ab25f90)
137da2899SCharles.Forsythimplement Env;
237da2899SCharles.Forsyth
337da2899SCharles.Forsyth#
437da2899SCharles.Forsyth# Copyright © 2000 Vita Nuova Limited.  All rights reserved.
537da2899SCharles.Forsyth#
637da2899SCharles.Forsyth
737da2899SCharles.Forsythinclude "sys.m";
837da2899SCharles.Forsyth	sys: Sys;
937da2899SCharles.Forsythinclude "draw.m";
1037da2899SCharles.Forsythinclude "bufio.m";
1137da2899SCharles.Forsythinclude "readdir.m";
1237da2899SCharles.Forsythinclude "env.m";
1337da2899SCharles.Forsyth
1437da2899SCharles.ForsythENVDIR : con "/env/";
1537da2899SCharles.Forsyth
1637da2899SCharles.Forsythsetenv(var: string, val: string): int
1737da2899SCharles.Forsyth{
1837da2899SCharles.Forsyth	init();
1937da2899SCharles.Forsyth	if (var == nil || !nameok(var)) {
2037da2899SCharles.Forsyth		sys->werrstr("bad variable name");
2137da2899SCharles.Forsyth		return -1;
2237da2899SCharles.Forsyth	}
2337da2899SCharles.Forsyth	if (val == nil) {
2437da2899SCharles.Forsyth		sys->remove(ENVDIR+var);
2537da2899SCharles.Forsyth		return 0;
2637da2899SCharles.Forsyth	}
2737da2899SCharles.Forsyth	fd := sys->create(ENVDIR+var, Sys->OWRITE, 8r600);
2837da2899SCharles.Forsyth	if (fd == nil)
2937da2899SCharles.Forsyth		return -1;
3037da2899SCharles.Forsyth	valb := array of byte val;
3137da2899SCharles.Forsyth	if (sys->write(fd, valb, len valb) != len valb)
3237da2899SCharles.Forsyth		return -1;
3337da2899SCharles.Forsyth	return 0;
3437da2899SCharles.Forsyth}
3537da2899SCharles.Forsyth
3637da2899SCharles.Forsythgetenv(var: string): string
3737da2899SCharles.Forsyth{
3837da2899SCharles.Forsyth	init();
3937da2899SCharles.Forsyth	if (var == nil || !nameok(var))
4037da2899SCharles.Forsyth		return nil;
4137da2899SCharles.Forsyth	fd := sys->open(ENVDIR+var, Sys->OREAD);
4237da2899SCharles.Forsyth	if (fd == nil)
4337da2899SCharles.Forsyth		return nil;
4437da2899SCharles.Forsyth	(ok, stat) := sys->fstat(fd);
4537da2899SCharles.Forsyth	if (ok == -1)
4637da2899SCharles.Forsyth		return nil;
4737da2899SCharles.Forsyth	buf := array[int stat.length] of byte;
4837da2899SCharles.Forsyth	n := sys->read(fd, buf, len buf);
4937da2899SCharles.Forsyth	if (n < 0)
5037da2899SCharles.Forsyth		return nil;
5137da2899SCharles.Forsyth	return string buf[0:n];
5237da2899SCharles.Forsyth}
5337da2899SCharles.Forsyth
5437da2899SCharles.Forsythgetall(): list of (string, string)
5537da2899SCharles.Forsyth{
5637da2899SCharles.Forsyth	readdir := load Readdir Readdir->PATH;
5737da2899SCharles.Forsyth	if (readdir == nil)
5837da2899SCharles.Forsyth		return nil;
59*9b29ac7eSCharles.Forsyth	(a, nil) := readdir->init(ENVDIR,
6037da2899SCharles.Forsyth			Readdir->NONE | Readdir->COMPACT | Readdir->DESCENDING);
6137da2899SCharles.Forsyth	vl: list of (string, string);
6237da2899SCharles.Forsyth	for (i := 0; i < len a; i++)
6337da2899SCharles.Forsyth		vl = (a[i].name, getenv(a[i].name)) :: vl;
6437da2899SCharles.Forsyth	return vl;
6537da2899SCharles.Forsyth}
6637da2899SCharles.Forsyth
6737da2899SCharles.Forsyth# clone the current environment
6837da2899SCharles.Forsythclone(): int
6937da2899SCharles.Forsyth{
7037da2899SCharles.Forsyth	init();
7137da2899SCharles.Forsyth	return sys->pctl(sys->FORKENV, nil);
7237da2899SCharles.Forsyth}
7337da2899SCharles.Forsyth
7437da2899SCharles.Forsythnew(): int
7537da2899SCharles.Forsyth{
7637da2899SCharles.Forsyth	init();
7737da2899SCharles.Forsyth	return sys->pctl(sys->NEWENV, nil);
7837da2899SCharles.Forsyth}
7937da2899SCharles.Forsyth
8037da2899SCharles.Forsythinit()
8137da2899SCharles.Forsyth{
8237da2899SCharles.Forsyth	if (sys == nil)
8337da2899SCharles.Forsyth		sys = load Sys Sys->PATH;
8437da2899SCharles.Forsyth}
8537da2899SCharles.Forsyth
8637da2899SCharles.Forsythnameok(var: string): int
8737da2899SCharles.Forsyth{
8837da2899SCharles.Forsyth	for(i:=0; i<len var; i++)
8937da2899SCharles.Forsyth		if (var[i] == '/') return 0;
9037da2899SCharles.Forsyth	return 1;
9137da2899SCharles.Forsyth}
92