|  | // Copyright 2016 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. | 
|  |  | 
|  | //go:build ignore | 
|  |  | 
|  | // mkpost processes the output of cgo -godefs to | 
|  | // modify the generated types. It is used to clean up | 
|  | // the syscall API in an architecture specific manner. | 
|  | // | 
|  | // mkpost is run after cgo -godefs by mkall.sh. | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "go/format" | 
|  | "io" | 
|  | "log" | 
|  | "os" | 
|  | "regexp" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | func main() { | 
|  | b, err := io.ReadAll(os.Stdin) | 
|  | if err != nil { | 
|  | log.Fatal(err) | 
|  | } | 
|  | s := string(b) | 
|  |  | 
|  | goarch := os.Getenv("GOARCH") | 
|  | goos := os.Getenv("GOOS") | 
|  | switch { | 
|  | case goarch == "s390x" && goos == "linux": | 
|  | // Export the types of PtraceRegs fields. | 
|  | re := regexp.MustCompile("ptrace(Psw|Fpregs|Per)") | 
|  | s = re.ReplaceAllString(s, "Ptrace$1") | 
|  |  | 
|  | // Replace padding fields inserted by cgo with blank identifiers. | 
|  | re = regexp.MustCompile("Pad_cgo[A-Za-z0-9_]*") | 
|  | s = re.ReplaceAllString(s, "_") | 
|  |  | 
|  | // We want to keep the X_ fields that are already consistently exported | 
|  | // for the other linux GOARCH settings. | 
|  | // Hide them and restore later. | 
|  | s = strings.Replace(s, "X__val", "MKPOSTFSIDVAL", 1) | 
|  | s = strings.Replace(s, "X__ifi_pad", "MKPOSTIFIPAD", 1) | 
|  | s = strings.Replace(s, "X_f", "MKPOSTSYSINFOTF", 1) | 
|  |  | 
|  | // Replace other unwanted fields with blank identifiers. | 
|  | re = regexp.MustCompile("X_[A-Za-z0-9_]*") | 
|  | s = re.ReplaceAllString(s, "_") | 
|  |  | 
|  | // Restore preserved fields. | 
|  | s = strings.Replace(s, "MKPOSTFSIDVAL", "X__val", 1) | 
|  | s = strings.Replace(s, "MKPOSTIFIPAD", "X__ifi_pad", 1) | 
|  | s = strings.Replace(s, "MKPOSTSYSINFOTF", "X_f", 1) | 
|  |  | 
|  | // Force the type of RawSockaddr.Data to [14]int8 to match | 
|  | // the existing gccgo API. | 
|  | re = regexp.MustCompile("(Data\\s+\\[14\\])uint8") | 
|  | s = re.ReplaceAllString(s, "${1}int8") | 
|  |  | 
|  | case goos == "freebsd": | 
|  | // Keep pre-FreeBSD 10 / non-POSIX 2008 names for timespec fields | 
|  | re := regexp.MustCompile("(A|M|C|Birth)tim\\s+Timespec") | 
|  | s = re.ReplaceAllString(s, "${1}timespec Timespec") | 
|  | } | 
|  |  | 
|  | // gofmt | 
|  | b, err = format.Source([]byte(s)) | 
|  | if err != nil { | 
|  | log.Fatal(err) | 
|  | } | 
|  |  | 
|  | // Append this command to the header to show where the new file | 
|  | // came from. | 
|  | re := regexp.MustCompile("(cgo -godefs [a-zA-Z0-9_]+\\.go.*)") | 
|  | s = re.ReplaceAllString(string(b), "$1 | go run mkpost.go") | 
|  |  | 
|  | fmt.Print(s) | 
|  | } |