Source file
src/runtime/write_err_android.go
1
2
3
4
5 package runtime
6
7 import (
8 "internal/byteorder"
9 "unsafe"
10 )
11
12 var (
13 writeHeader = []byte{6 , 'G', 'o', 0}
14 writePath = []byte("/dev/log/main\x00")
15 writeLogd = []byte("/dev/socket/logdw\x00")
16
17
18 writeFD uintptr
19 writeBuf [1024]byte
20 writePos int
21 )
22
23
24
25
26
27
28 type loggerType int32
29
30 const (
31 unknown loggerType = iota
32 legacy
33 logd
34
35 )
36
37 var logger loggerType
38
39 func writeErr(b []byte) {
40 if len(b) == 0 {
41 return
42 }
43
44 if logger == unknown {
45
46 if v := uintptr(access(&writeLogd[0], 0x02 )); v == 0 {
47 logger = logd
48 initLogd()
49 } else {
50 logger = legacy
51 initLegacy()
52 }
53 }
54
55
56
57 writeErrData(&b[0], int32(len(b)))
58
59
60
61
62
63
64
65
66
67
68 var hlen int
69 switch logger {
70 case logd:
71 hlen = writeLogdHeader()
72 case legacy:
73 hlen = len(writeHeader)
74 }
75
76 dst := writeBuf[hlen:]
77 for _, v := range b {
78 if v == 0 {
79 v = '0'
80 }
81 dst[writePos] = v
82 writePos++
83 if v == '\n' || writePos == len(dst)-1 {
84 dst[writePos] = 0
85 write(writeFD, unsafe.Pointer(&writeBuf[0]), int32(hlen+writePos))
86 clear(dst)
87 writePos = 0
88 }
89 }
90 }
91
92 func initLegacy() {
93
94 writeFD = uintptr(open(&writePath[0], 0x1 , 0))
95 if writeFD == 0 {
96
97
98
99 msg := []byte("runtime: cannot open /dev/log/main\x00")
100 write(2, unsafe.Pointer(&msg[0]), int32(len(msg)))
101 exit(2)
102 }
103
104
105 copy(writeBuf[:len(writeHeader)], writeHeader)
106 }
107
108
109 var logdAddr sockaddr_un
110
111 func initLogd() {
112
113 logdAddr.family = _AF_UNIX
114 copy(logdAddr.path[:], writeLogd)
115
116
117
118
119
120 fd := socket(_AF_UNIX, _SOCK_DGRAM|_O_CLOEXEC, 0)
121 if fd < 0 {
122 msg := []byte("runtime: cannot create a socket for logging\x00")
123 write(2, unsafe.Pointer(&msg[0]), int32(len(msg)))
124 exit(2)
125 }
126
127 errno := connect(fd, unsafe.Pointer(&logdAddr), int32(unsafe.Sizeof(logdAddr)))
128 if errno < 0 {
129 msg := []byte("runtime: cannot connect to /dev/socket/logdw\x00")
130 write(2, unsafe.Pointer(&msg[0]), int32(len(msg)))
131
132 exit(2)
133 }
134 writeFD = uintptr(fd)
135
136
137
138 copy(writeBuf[11:11+len(writeHeader)], writeHeader)
139 }
140
141
142 func writeLogdHeader() int {
143 hdr := writeBuf[:11]
144
145
146
147
148
149
150
151
152 hdr[0] = 0
153 sec, nsec, _ := time_now()
154 byteorder.LEPutUint32(hdr[3:7], uint32(sec))
155 byteorder.LEPutUint32(hdr[7:11], uint32(nsec))
156
157
158
159 return 11 + len(writeHeader)
160 }
161
View as plain text