#include <9pm/windows.h>
#include <9pm/u.h>
#include <9pm/libc.h>
#include <9pm/ns.h>
#include <9pm/ctype.h>
static char*
wenv2env(Rune *r)
{
char *s;
Rune *rr;
int len, n;
len = 0;
for(rr=r; *rr; rr+=runestrlen(rr)+1)
len += runenlen(rr, runestrlen(rr))+1;
len += 10;
s = smalloc(len);
n = 0;
for(rr=r; *rr; rr+=runestrlen(rr)+1){
win_wstr2utfn(s+n, len-n, rr);
dprint(PmDebugNs, "'%s'\n", s+n);
n += strlen(s+n)+1;
}
return s;
}
/*
* Only to be called at startup, hence no locks.
*/
void
fillegrp(Egrp *g)
{
LPWSTR wenv;
char *env, *p, *q, *s;
Evalue **l, *e;
wenv = GetEnvironmentStrings();
if(wenv == nil)
return;
env = wenv2env(wenv);
FreeEnvironmentStrings(wenv);
assert(g->entries == nil);
l = &g->entries;
for(p=env; *p; p+=strlen(p)+1){
q = strchr(p, '=');
if(q == nil) /* shouldn't happen */
continue;
if(q == p) /* windows has weird variables named with = */
continue;
*q = '\0';
e = smalloc(sizeof(Evalue));
e->name = smalloc(strlen(p)+1);
e->value = smalloc(strlen(q+1)+1);
strcpy(e->name, p);
strcpy(e->value, q+1);
e->len = strlen(e->value);
/* windows variables are case insensitive; make 'em lower case */
// for(s=e->name; *s; s++)
// if(isupper(*s))
// *s = tolower(*s);
e->qid.path = ++g->path;
*q = '=';
*l = e;
l = &e->link;
}
*l = nil;
free(env);
}
/*
* Should probably be locks here.
* Then again we only call it in exec, which has
* is in its own egrp, I believe.
*/
Rune*
_fetchegrp(Egrp *eg)
{
int len, n;
Evalue *e;
Rune *r, *or;
len = 0;
for(e=eg->entries; e; e=e->link){
len += utflen(e->name)+1+1;
if(e->value)
len += utflen(e->value);
}
len++;
n = 0;
r = smalloc(len*sizeof(Rune));
or = r;
for(e=eg->entries; e; e=e->link){
win_utf2wstrn(r+n, len-n, e->name);
n += runestrlen(r+n);
r[n++] = '=';
if(e->value){
win_utf2wstrn(r+n, len-n, e->value);
n += runestrlen(r+n);
}
r[n++] = '\0';
}
r[n++] = '\0';
return or;
}
syntax highlighted by Code2HTML, v. 0.9.1