annotate libgo/runtime/go-setenv.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* go-setenv.c -- set the C environment from Go.
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 Copyright 2011 The Go Authors. All rights reserved.
kono
parents:
diff changeset
4 Use of this source code is governed by a BSD-style
kono
parents:
diff changeset
5 license that can be found in the LICENSE file. */
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #include "config.h"
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 #include <stddef.h>
kono
parents:
diff changeset
10 #include <stdlib.h>
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 #include "runtime.h"
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 /* Set the C environment from Go. This is called by syscall.Setenv. */
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 void setenv_c (String, String) __asm__ (GOSYM_PREFIX "syscall.setenv_c");
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 void
kono
parents:
diff changeset
19 setenv_c (String k, String v)
kono
parents:
diff changeset
20 {
kono
parents:
diff changeset
21 const byte *ks;
kono
parents:
diff changeset
22 unsigned char *kn;
kono
parents:
diff changeset
23 const byte *vs;
kono
parents:
diff changeset
24 unsigned char *vn;
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 ks = k.str;
kono
parents:
diff changeset
27 if (ks == NULL)
kono
parents:
diff changeset
28 ks = (const byte *) "";
kono
parents:
diff changeset
29 kn = NULL;
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 vs = v.str;
kono
parents:
diff changeset
32 if (vs == NULL)
kono
parents:
diff changeset
33 vs = (const byte *) "";
kono
parents:
diff changeset
34 vn = NULL;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 #ifdef HAVE_SETENV
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 if (ks[k.len] != 0)
kono
parents:
diff changeset
39 {
kono
parents:
diff changeset
40 kn = malloc (k.len + 1);
kono
parents:
diff changeset
41 if (kn == NULL)
kono
parents:
diff changeset
42 runtime_throw ("out of malloc memory");
kono
parents:
diff changeset
43 __builtin_memcpy (kn, ks, k.len);
kono
parents:
diff changeset
44 kn[k.len] = '\0';
kono
parents:
diff changeset
45 ks = kn;
kono
parents:
diff changeset
46 }
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 if (vs[v.len] != 0)
kono
parents:
diff changeset
49 {
kono
parents:
diff changeset
50 vn = malloc (v.len + 1);
kono
parents:
diff changeset
51 if (vn == NULL)
kono
parents:
diff changeset
52 runtime_throw ("out of malloc memory");
kono
parents:
diff changeset
53 __builtin_memcpy (vn, vs, v.len);
kono
parents:
diff changeset
54 vn[v.len] = '\0';
kono
parents:
diff changeset
55 vs = vn;
kono
parents:
diff changeset
56 }
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 setenv ((const char *) ks, (const char *) vs, 1);
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 #else /* !defined(HAVE_SETENV) */
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 len = k.len + v.len + 2;
kono
parents:
diff changeset
63 kn = malloc (len);
kono
parents:
diff changeset
64 if (kn == NULL)
kono
parents:
diff changeset
65 runtime_throw ("out of malloc memory");
kono
parents:
diff changeset
66 __builtin_memcpy (kn, ks, k.len);
kono
parents:
diff changeset
67 kn[k.len] = '=';
kono
parents:
diff changeset
68 __builtin_memcpy (kn + k.len + 1, vs, v.len);
kono
parents:
diff changeset
69 kn[k.len + v.len + 1] = '\0';
kono
parents:
diff changeset
70 putenv ((char *) kn);
kono
parents:
diff changeset
71 kn = NULL; /* putenv takes ownership of the string. */
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 #endif /* !defined(HAVE_SETENV) */
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 if (kn != NULL)
kono
parents:
diff changeset
76 free (kn);
kono
parents:
diff changeset
77 if (vn != NULL)
kono
parents:
diff changeset
78 free (vn);
kono
parents:
diff changeset
79 }