log_ios.go raw
1 // SPDX-License-Identifier: Unlicense OR MIT
2
3 // +build darwin,ios
4
5 package log
6
7 /*
8 #cgo CFLAGS: -Werror -fmodules -fobjc-arc -x objective-c
9
10 __attribute__ ((visibility ("hidden"))) void nslog(char *str);
11 */
12 import "C"
13
14 import (
15 "bufio"
16 "io"
17 "log"
18 "unsafe"
19
20 _ "github.com/p9c/p9/pkg/gel/gio/internal/cocoainit"
21 )
22
23 func init() {
24 // macOS Console already includes timestamps.
25 log.SetFlags(log.Flags() &^ log.LstdFlags)
26 log.SetOutput(newNSLogWriter())
27 }
28
29 func newNSLogWriter() io.Writer {
30 r, w := io.Pipe()
31 go func() {
32 // 1024 is an arbitrary truncation limit, taken from Android's
33 // log buffer size.
34 lineBuf := bufio.NewReaderSize(r, 1024)
35 // The buffer to pass to C, including the terminating '\0'.
36 buf := make([]byte, lineBuf.Size()+1)
37 cbuf := (*C.char)(unsafe.Pointer(&buf[0]))
38 for {
39 line, _, err := lineBuf.ReadLine()
40 if err != nil {
41 break
42 }
43 copy(buf, line)
44 buf[len(line)] = 0
45 C.nslog(cbuf)
46 }
47 }()
48 return w
49 }
50