]> Cypherpunks repositories - gostls13.git/commitdiff
os: report Windows exit status in hex
authorRuss Cox <rsc@golang.org>
Sat, 30 Jan 2021 12:27:24 +0000 (07:27 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 19 Feb 2021 00:01:17 +0000 (00:01 +0000)
We print things like “exit status 3221225477
but the standard Windows form is 0xc0000005.

This CL is part of a stack adding windows/arm64
support (#36439), intended to land in the Go 1.17 cycle.
This CL is, however, not windows/arm64-specific.
It is cleanup meant to make the port (and future ports) easier.

Change-Id: Iefe447d4d1781b53bef9619f68d386f2866b2934
Reviewed-on: https://go-review.googlesource.com/c/go/+/288792
Trust: Russ Cox <rsc@golang.org>
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/os/exec_posix.go
src/os/str.go

index 7ecddaed374d8a31699b5a75ddc67bda31221c1d..39f11c7ec1b7be613fd9ae5b77822183df20f607 100644 (file)
@@ -102,7 +102,12 @@ func (p *ProcessState) String() string {
        res := ""
        switch {
        case status.Exited():
-               res = "exit status " + itoa(status.ExitStatus())
+               code := status.ExitStatus()
+               if runtime.GOOS == "windows" && code >= 1<<16 { // windows uses large hex numbers
+                       res = "exit status " + uitox(uint(code))
+               } else { // unix systems use small decimal integers
+                       res = "exit status " + itoa(code) // unix
+               }
        case status.Signaled():
                res = "signal: " + status.Signal().String()
        case status.Stopped():
index cba9fa3e8d41de985a6f6c45eb293b4be322ea2f..9bfcc15aa82b88b232baf30902e5f9c4a0715877 100644 (file)
@@ -6,7 +6,7 @@
 
 package os
 
-// Convert integer to decimal string
+// itoa converts val (an int) to a decimal string.
 func itoa(val int) string {
        if val < 0 {
                return "-" + uitoa(uint(-val))
@@ -14,7 +14,7 @@ func itoa(val int) string {
        return uitoa(uint(val))
 }
 
-// Convert unsigned integer to decimal string
+// uitoa converts val (a uint) to a decimal string.
 func uitoa(val uint) string {
        if val == 0 { // avoid string allocation
                return "0"
@@ -31,3 +31,35 @@ func uitoa(val uint) string {
        buf[i] = byte('0' + val)
        return string(buf[i:])
 }
+
+// itox converts val (an int) to a hexdecimal string.
+func itox(val int) string {
+       if val < 0 {
+               return "-" + uitox(uint(-val))
+       }
+       return uitox(uint(val))
+}
+
+const hex = "0123456789abcdef"
+
+// uitox converts val (a uint) to a hexdecimal string.
+func uitox(val uint) string {
+       if val == 0 { // avoid string allocation
+               return "0x0"
+       }
+       var buf [20]byte // big enough for 64bit value base 16 + 0x
+       i := len(buf) - 1
+       for val >= 16 {
+               q := val / 16
+               buf[i] = hex[val%16]
+               i--
+               val = q
+       }
+       // val < 16
+       buf[i] = hex[val%16]
+       i--
+       buf[i] = 'x'
+       i--
+       buf[i] = '0'
+       return string(buf[i:])
+}