I missed that environment is used during runtime setup,
well before go init() functions run. Implemented os-dependent
runtime.goenvs functions to allow for different unix, plan9 and
windows versions of environment discovery.
R=rsc, paulzhol
CC=golang-dev
https://golang.org/cl/
3787046
func init() {
var argc int32
- Envs = Environ()
cmd := syscall.GetCommandLine()
argv, e := syscall.CommandLineToArgv(cmd, &argc)
if e != 0 {
runtime·bsdthread_register();
}
+void
+runtime·goenvs(void)
+{
+ runtime·goenvs_unix();
+}
+
void
runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void))
{
{
}
+void
+runtime·goenvs(void)
+{
+ runtime·goenvs_unix();
+}
+
// Called to initialize a new m (including the bootstrap m).
void
runtime·minit(void)
{
}
+void
+runtime·goenvs(void)
+{
+ runtime·goenvs_unix();
+}
+
// Called to initialize a new m (including the bootstrap m).
void
runtime·minit(void)
{
}
+void
+runtime·goenvs(void)
+{
+}
+
void
runtime·initsig(int32 queue)
{
runtime·mallocinit();
runtime·goargs();
+ runtime·goenvs();
// For debugging:
// Allocate internal symbol table representation now,
void
runtime·goargs(void)
{
- String *gargv;
- String *genvv;
- int32 i, envc;
+ String *s;
+ int32 i;
// for windows implementation see "os" package
if(Windows)
return;
- if(runtime·isplan9)
- envc=0;
- else
- for(envc=0; argv[argc+1+envc] != 0; envc++)
- ;
-
- gargv = runtime·malloc(argc*sizeof gargv[0]);
- genvv = runtime·malloc(envc*sizeof genvv[0]);
-
+ s = runtime·malloc(argc*sizeof s[0]);
for(i=0; i<argc; i++)
- gargv[i] = runtime·gostringnocopy(argv[i]);
- os·Args.array = (byte*)gargv;
+ s[i] = runtime·gostringnocopy(argv[i]);
+ os·Args.array = (byte*)s;
os·Args.len = argc;
os·Args.cap = argc;
+}
- for(i=0; i<envc; i++)
- genvv[i] = runtime·gostringnocopy(argv[argc+1+i]);
- os·Envs.array = (byte*)genvv;
- os·Envs.len = envc;
- os·Envs.cap = envc;
+void
+runtime·goenvs_unix(void)
+{
+ String *s;
+ int32 i, n;
+
+ for(n=0; argv[argc+1+n] != 0; n++)
+ ;
+
+ s = runtime·malloc(n*sizeof s[0]);
+ for(i=0; i<n; i++)
+ s[i] = runtime·gostringnocopy(argv[argc+1+i]);
+ os·Envs.array = (byte*)s;
+ os·Envs.len = n;
+ os·Envs.cap = n;
}
// Atomic add and return new value.
*/
int32 runtime·strcmp(byte*, byte*);
int32 runtime·findnull(byte*);
+int32 runtime·findnullw(uint16*);
void runtime·dump(byte*, int32);
int32 runtime·runetochar(byte*, int32);
int32 runtime·charntorune(int32*, uint8*, int32);
uintptr runtime·gosave(Gobuf*);
void runtime·lessstack(void);
void runtime·goargs(void);
+void runtime·goenvs(void);
+void runtime·goenvs_unix(void);
void* runtime·getu(void);
void runtime·throw(int8*);
void runtime·panicstring(int8*);
String runtime·gostring(byte*);
String runtime·gostringn(byte*, int32);
String runtime·gostringnocopy(byte*);
+String runtime·gostringw(uint16*);
void runtime·initsig(int32);
int32 runtime·gotraceback(void);
void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp);
return l;
}
+int32
+runtime·findnullw(uint16 *s)
+{
+ int32 l;
+
+ if(s == nil)
+ return 0;
+ for(l=0; s[l]!=0; l++)
+ ;
+ return l;
+}
+
int32 runtime·maxstring = 256;
String
return s;
}
+String
+runtime·gostringw(uint16 *str)
+{
+ int32 n, i;
+ byte buf[8];
+ String s;
+
+ n = 0;
+ for(i=0; str[i]; i++)
+ n += runtime·runetochar(buf, str[i]);
+ s = runtime·gostringsize(n+4);
+ n = 0;
+ for(i=0; str[i]; i++)
+ n += runtime·runetochar(s.str+n, str[i]);
+ s.len = n;
+ return s;
+}
+
String
runtime·catstring(String s1, String s2)
{
{
}
+void
+runtime·goenvs(void)
+{
+ runtime·goenvs_unix();
+}
+
void
runtime·initsig(int32 queue)
{
{
}
+#pragma dynimport runtime·GetEnvironmentStringsW GetEnvironmentStringsW "kernel32.dll"
+#pragma dynimport runtime·FreeEnvironmentStringsW FreeEnvironmentStringsW "kernel32.dll"
+
+extern void *runtime·GetEnvironmentStringsW;
+extern void *runtime·FreeEnvironmentStringsW;
+
+void
+runtime·goenvs(void)
+{
+ extern Slice os·Envs;
+
+ uint16 *env;
+ String *s;
+ int32 i, n;
+ uint16 *p;
+
+ env = runtime·stdcall(runtime·GetEnvironmentStringsW, 0);
+
+ n = 0;
+ for(p=env; *p; n++)
+ p += runtime·findnullw(p)+1;
+
+ s = runtime·malloc(n*sizeof s[0]);
+
+ p = env;
+ for(i=0; i<n; i++) {
+ s[i] = runtime·gostringw(p);
+ p += runtime·findnullw(p)+1;
+ }
+ os·Envs.array = (byte*)s;
+ os·Envs.len = n;
+ os·Envs.cap = n;
+
+ runtime·stdcall(runtime·FreeEnvironmentStringsW, 1, env);
+}
+
void
runtime·exit(int32 code)
{