mirror of
https://github.com/cbeuw/Cloak.git
synced 2024-11-17 15:25:30 +00:00
86 lines
1.6 KiB
Go
86 lines
1.6 KiB
Go
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
// +build android
|
||
|
|
||
|
package main
|
||
|
|
||
|
/*
|
||
|
To view the log output run:
|
||
|
adb logcat GoLog:I *:S
|
||
|
*/
|
||
|
|
||
|
// Android redirects stdout and stderr to /dev/null.
|
||
|
// As these are common debugging utilities in Go,
|
||
|
// we redirect them to logcat.
|
||
|
//
|
||
|
// Unfortunately, logcat is line oriented, so we must buffer.
|
||
|
|
||
|
/*
|
||
|
#cgo LDFLAGS: -landroid -llog
|
||
|
|
||
|
#include <android/log.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
*/
|
||
|
import "C"
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"log"
|
||
|
"os"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
ctag = C.CString("cloak")
|
||
|
)
|
||
|
|
||
|
type infoWriter struct{}
|
||
|
|
||
|
func (infoWriter) Write(p []byte) (n int, err error) {
|
||
|
cstr := C.CString(string(p))
|
||
|
C.__android_log_write(C.ANDROID_LOG_INFO, ctag, cstr)
|
||
|
C.free(unsafe.Pointer(cstr))
|
||
|
return len(p), nil
|
||
|
}
|
||
|
|
||
|
func lineLog(f *os.File, priority C.int) {
|
||
|
const logSize = 1024 // matches android/log.h.
|
||
|
r := bufio.NewReaderSize(f, logSize)
|
||
|
for {
|
||
|
line, _, err := r.ReadLine()
|
||
|
str := string(line)
|
||
|
if err != nil {
|
||
|
str += " " + err.Error()
|
||
|
}
|
||
|
cstr := C.CString(str)
|
||
|
C.__android_log_write(priority, ctag, cstr)
|
||
|
C.free(unsafe.Pointer(cstr))
|
||
|
if err != nil {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func log_init() {
|
||
|
log.SetOutput(infoWriter{})
|
||
|
// android logcat includes all of log.LstdFlags
|
||
|
log.SetFlags(log.Flags() &^ log.LstdFlags)
|
||
|
|
||
|
r, w, err := os.Pipe()
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
os.Stderr = w
|
||
|
go lineLog(r, C.ANDROID_LOG_ERROR)
|
||
|
|
||
|
r, w, err = os.Pipe()
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
os.Stdout = w
|
||
|
go lineLog(r, C.ANDROID_LOG_INFO)
|
||
|
}
|