cmd: continue lint fixes.
This commit is contained in:
@@ -86,7 +86,6 @@ linters:
|
|||||||
- godoclint # checks Golang's documentation practice
|
- godoclint # checks Golang's documentation practice
|
||||||
- godot # checks if comments end in a period
|
- godot # checks if comments end in a period
|
||||||
- gomoddirectives # manages the use of 'replace', 'retract', and 'excludes' directives in go.mod
|
- gomoddirectives # manages the use of 'replace', 'retract', and 'excludes' directives in go.mod
|
||||||
- goprintffuncname # checks that printf-like functions are named with f at the end
|
|
||||||
- gosec # inspects source code for security problems
|
- gosec # inspects source code for security problems
|
||||||
- govet # reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
|
- govet # reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
|
||||||
- iface # checks the incorrect use of interfaces, helping developers avoid interface pollution
|
- iface # checks the incorrect use of interfaces, helping developers avoid interface pollution
|
||||||
@@ -465,6 +464,8 @@ linters:
|
|||||||
linters: [ testableexamples ]
|
linters: [ testableexamples ]
|
||||||
- path: 'main.go'
|
- path: 'main.go'
|
||||||
linters: [ forbidigo, mnd, reassign ]
|
linters: [ forbidigo, mnd, reassign ]
|
||||||
|
- path: 'cmd/cruntar/main.go'
|
||||||
|
linters: [ unparam ]
|
||||||
- source: 'TODO'
|
- source: 'TODO'
|
||||||
linters: [ godot ]
|
linters: [ godot ]
|
||||||
- text: 'should have a package comment'
|
- text: 'should have a package comment'
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"errors"
|
"errors"
|
||||||
@@ -99,18 +100,27 @@ func checkSite(hostport string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
d := &net.Dialer{Timeout: timeout}
|
d := &net.Dialer{Timeout: timeout}
|
||||||
conn, err := tls.DialWithDialer(
|
tcfg := &tls.Config{
|
||||||
d,
|
InsecureSkipVerify: true,
|
||||||
"tcp",
|
ServerName: target.Host,
|
||||||
target.String(),
|
} // #nosec G402 -- CLI tool only verifies revocation
|
||||||
&tls.Config{InsecureSkipVerify: true, ServerName: target.Host}, // #nosec G402
|
td := &tls.Dialer{NetDialer: d, Config: tcfg}
|
||||||
)
|
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
conn, err := td.DialContext(ctx, "tcp", target.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return strUnknown, err
|
return strUnknown, err
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
state := conn.ConnectionState()
|
tconn, ok := conn.(*tls.Conn)
|
||||||
|
if !ok {
|
||||||
|
return strUnknown, errors.New("connection is not TLS")
|
||||||
|
}
|
||||||
|
|
||||||
|
state := tconn.ConnectionState()
|
||||||
if len(state.PeerCertificates) == 0 {
|
if len(state.PeerCertificates) == 0 {
|
||||||
return strUnknown, errors.New("no peer certificates presented")
|
return strUnknown, errors.New("no peer certificates presented")
|
||||||
}
|
}
|
||||||
@@ -125,7 +135,8 @@ func evaluateCert(cert *x509.Certificate) (string, error) {
|
|||||||
if revoked {
|
if revoked {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg := err.Error()
|
msg := err.Error()
|
||||||
if strings.Contains(msg, "expired") || strings.Contains(msg, "isn't valid until") || strings.Contains(msg, "not valid until") {
|
if strings.Contains(msg, "expired") || strings.Contains(msg, "isn't valid until") ||
|
||||||
|
strings.Contains(msg, "not valid until") {
|
||||||
return strExpired, err
|
return strExpired, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"git.wntrmute.dev/kyle/goutils/die"
|
"git.wntrmute.dev/kyle/goutils/die"
|
||||||
)
|
)
|
||||||
@@ -27,13 +28,15 @@ func main() {
|
|||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
details := conn.ConnectionState()
|
details := conn.ConnectionState()
|
||||||
|
var chainSb30 strings.Builder
|
||||||
for _, cert := range details.PeerCertificates {
|
for _, cert := range details.PeerCertificates {
|
||||||
p := pem.Block{
|
p := pem.Block{
|
||||||
Type: "CERTIFICATE",
|
Type: "CERTIFICATE",
|
||||||
Bytes: cert.Raw,
|
Bytes: cert.Raw,
|
||||||
}
|
}
|
||||||
chain += string(pem.EncodeToMemory(&p))
|
chainSb30.WriteString(string(pem.EncodeToMemory(&p)))
|
||||||
}
|
}
|
||||||
|
chain += chainSb30.String()
|
||||||
|
|
||||||
fmt.Fprintln(os.Stdout, chain)
|
fmt.Fprintln(os.Stdout, chain)
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
//lint:file-ignore SA1019 allow strict compatibility for old certs
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -136,9 +137,11 @@ var (
|
|||||||
|
|
||||||
func wrapPrint(text string, indent int) {
|
func wrapPrint(text string, indent int) {
|
||||||
tabs := ""
|
tabs := ""
|
||||||
for i := 0; i < indent; i++ {
|
var tabsSb140 strings.Builder
|
||||||
tabs += "\t"
|
for range indent {
|
||||||
|
tabsSb140.WriteString("\t")
|
||||||
}
|
}
|
||||||
|
tabs += tabsSb140.String()
|
||||||
|
|
||||||
fmt.Fprintf(os.Stdout, tabs+"%s\n", wrap(text, indent))
|
fmt.Fprintf(os.Stdout, tabs+"%s\n", wrap(text, indent))
|
||||||
}
|
}
|
||||||
@@ -306,7 +309,7 @@ func main() {
|
|||||||
|
|
||||||
// This is needed for getting certs from JSON/jq.
|
// This is needed for getting certs from JSON/jq.
|
||||||
certs = bytes.TrimSpace(certs)
|
certs = bytes.TrimSpace(certs)
|
||||||
certs = bytes.Replace(certs, []byte(`\n`), []byte{0xa}, -1)
|
certs = bytes.ReplaceAll(certs, []byte(`\n`), []byte{0xa})
|
||||||
certs = bytes.Trim(certs, `"`)
|
certs = bytes.Trim(certs, `"`)
|
||||||
displayAllCerts(certs, leafOnly)
|
displayAllCerts(certs, leafOnly)
|
||||||
} else {
|
} else {
|
||||||
@@ -42,23 +42,6 @@ var extKeyUsages = map[x509.ExtKeyUsage]string{
|
|||||||
x509.ExtKeyUsageMicrosoftKernelCodeSigning: "microsoft kernel code signing",
|
x509.ExtKeyUsageMicrosoftKernelCodeSigning: "microsoft kernel code signing",
|
||||||
}
|
}
|
||||||
|
|
||||||
func pubKeyAlgo(a x509.PublicKeyAlgorithm) string {
|
|
||||||
switch a {
|
|
||||||
case x509.UnknownPublicKeyAlgorithm:
|
|
||||||
return "unknown public key algorithm"
|
|
||||||
case x509.RSA:
|
|
||||||
return "RSA"
|
|
||||||
case x509.ECDSA:
|
|
||||||
return "ECDSA"
|
|
||||||
case x509.DSA:
|
|
||||||
return "DSA"
|
|
||||||
case x509.Ed25519:
|
|
||||||
return "Ed25519"
|
|
||||||
default:
|
|
||||||
return "unknown public key algorithm"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func sigAlgoPK(a x509.SignatureAlgorithm) string {
|
func sigAlgoPK(a x509.SignatureAlgorithm) string {
|
||||||
switch a {
|
switch a {
|
||||||
case x509.MD2WithRSA, x509.MD5WithRSA, x509.SHA1WithRSA, x509.SHA256WithRSA, x509.SHA384WithRSA, x509.SHA512WithRSA:
|
case x509.MD2WithRSA, x509.MD5WithRSA, x509.SHA1WithRSA, x509.SHA256WithRSA, x509.SHA384WithRSA, x509.SHA512WithRSA:
|
||||||
@@ -111,9 +94,11 @@ const maxLine = 78
|
|||||||
|
|
||||||
func makeIndent(n int) string {
|
func makeIndent(n int) string {
|
||||||
s := " "
|
s := " "
|
||||||
for i := 0; i < n; i++ {
|
var sSb97 strings.Builder
|
||||||
s += " "
|
for range n {
|
||||||
|
sSb97.WriteString(" ")
|
||||||
}
|
}
|
||||||
|
s += sSb97.String()
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +106,7 @@ func indentLen(n int) int {
|
|||||||
return 4 + (8 * n)
|
return 4 + (8 * n)
|
||||||
}
|
}
|
||||||
|
|
||||||
// this isn't real efficient, but that's not a problem here
|
// this isn't real efficient, but that's not a problem here.
|
||||||
func wrap(s string, indent int) string {
|
func wrap(s string, indent int) string {
|
||||||
if indent > 3 {
|
if indent > 3 {
|
||||||
indent = 3
|
indent = 3
|
||||||
@@ -144,9 +129,11 @@ func wrap(s string, indent int) string {
|
|||||||
|
|
||||||
func dumpHex(in []byte) string {
|
func dumpHex(in []byte) string {
|
||||||
var s string
|
var s string
|
||||||
|
var sSb130 strings.Builder
|
||||||
for i := range in {
|
for i := range in {
|
||||||
s += fmt.Sprintf("%02X:", in[i])
|
sSb130.WriteString(fmt.Sprintf("%02X:", in[i]))
|
||||||
}
|
}
|
||||||
|
s += sSb130.String()
|
||||||
|
|
||||||
return strings.Trim(s, ":")
|
return strings.Trim(s, ":")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ func displayName(name pkix.Name) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func expires(cert *x509.Certificate) time.Duration {
|
func expires(cert *x509.Certificate) time.Duration {
|
||||||
return cert.NotAfter.Sub(time.Now())
|
return time.Until(cert.NotAfter)
|
||||||
}
|
}
|
||||||
|
|
||||||
func inDanger(cert *x509.Certificate) bool {
|
func inDanger(cert *x509.Certificate) bool {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -68,7 +67,7 @@ func main() {
|
|||||||
lib.ProgName())
|
lib.ProgName())
|
||||||
}
|
}
|
||||||
|
|
||||||
fileData, err := ioutil.ReadFile(flag.Arg(0))
|
fileData, err := os.ReadFile(flag.Arg(0))
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
chain, err := certlib.ParseCertificatesPEM(fileData)
|
chain, err := certlib.ParseCertificatesPEM(fileData)
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"errors"
|
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
@@ -83,7 +83,7 @@ func scanner(host string, in io.Reader, out io.Writer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func logError(host string, err error, format string, args ...interface{}) {
|
func logError(host string, err error, format string, args ...any) {
|
||||||
msg := fmt.Sprintf(format, args...)
|
msg := fmt.Sprintf(format, args...)
|
||||||
log.Printf("[%s] FAILED: %s: %v\n", host, msg, err)
|
log.Printf("[%s] FAILED: %s: %v\n", host, msg, err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -270,7 +270,6 @@ func main() {
|
|||||||
|
|
||||||
err = processFile(tfr, hdr, top)
|
err = processFile(tfr, hdr, top)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Close()
|
r.Close()
|
||||||
|
|||||||
@@ -163,7 +163,6 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
var logLevel, mountDir, syncDir, target string
|
var logLevel, mountDir, syncDir, target string
|
||||||
var dryRun, quietMode, noSyslog, verboseRsync bool
|
var dryRun, quietMode, noSyslog, verboseRsync bool
|
||||||
|
|
||||||
|
|||||||
@@ -19,39 +19,37 @@ var (
|
|||||||
debug = dbg.New()
|
debug = dbg.New()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func openImage(imageFile string) (*os.File, []byte, error) {
|
||||||
func openImage(imageFile string) (image *os.File, hash []byte, err error) {
|
f, err := os.Open(imageFile)
|
||||||
image, err = os.Open(imageFile)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
hash, err = ahash.SumReader(hAlgo, image)
|
h, err := ahash.SumReader(hAlgo, f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = image.Seek(0, 0)
|
if _, err := f.Seek(0, 0); err != nil {
|
||||||
if err != nil {
|
return nil, nil, err
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
debug.Printf("%s %x\n", imageFile, hash)
|
debug.Printf("%s %x\n", imageFile, h)
|
||||||
return
|
return f, h, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func openDevice(devicePath string) (device *os.File, err error) {
|
func openDevice(devicePath string) (*os.File, error) {
|
||||||
fi, err := os.Stat(devicePath)
|
fi, err := os.Stat(devicePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
device, err = os.OpenFile(devicePath, os.O_RDWR|os.O_SYNC, fi.Mode())
|
device, err := os.OpenFile(devicePath, os.O_RDWR|os.O_SYNC, fi.Mode())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return device, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -3,28 +3,30 @@ package main
|
|||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.wntrmute.dev/kyle/goutils/die"
|
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.wntrmute.dev/kyle/goutils/die"
|
||||||
)
|
)
|
||||||
|
|
||||||
func usage(w io.Writer, exc int) {
|
func usage(w io.Writer, exc int) {
|
||||||
fmt.Fprintln(w, `usage: dumpbytes <file>`)
|
fmt.Fprintln(w, `usage: dumpbytes -n tabs <file>`)
|
||||||
os.Exit(exc)
|
os.Exit(exc)
|
||||||
}
|
}
|
||||||
|
|
||||||
func printBytes(buf []byte) {
|
func printBytes(buf []byte) {
|
||||||
fmt.Printf("\t")
|
fmt.Printf("\t")
|
||||||
for i := 0; i < len(buf); i++ {
|
for i := range buf {
|
||||||
fmt.Printf("0x%02x, ", buf[i])
|
fmt.Printf("0x%02x, ", buf[i])
|
||||||
}
|
}
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
}
|
}
|
||||||
|
|
||||||
func dumpFile(path string, indentLevel int) error {
|
func dumpFile(path string, indentLevel int) error {
|
||||||
indent := ""
|
var indent strings.Builder
|
||||||
for i := 0; i < indentLevel; i++ {
|
for range indentLevel {
|
||||||
indent += "\t"
|
indent.WriteByte('\t')
|
||||||
}
|
}
|
||||||
|
|
||||||
file, err := os.Open(path)
|
file, err := os.Open(path)
|
||||||
@@ -34,13 +36,13 @@ func dumpFile(path string, indentLevel int) error {
|
|||||||
|
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
fmt.Printf("%svar buffer = []byte{\n", indent)
|
fmt.Printf("%svar buffer = []byte{\n", indent.String())
|
||||||
for {
|
for {
|
||||||
buf := make([]byte, 8)
|
buf := make([]byte, 8)
|
||||||
n, err := file.Read(buf)
|
n, err := file.Read(buf)
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
fmt.Printf("%s", indent)
|
fmt.Printf("%s", indent.String())
|
||||||
printBytes(buf[:n])
|
printBytes(buf[:n])
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
@@ -50,11 +52,11 @@ func dumpFile(path string, indentLevel int) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("%s", indent)
|
fmt.Printf("%s", indent.String())
|
||||||
printBytes(buf[:n])
|
printBytes(buf[:n])
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("%s}\n", indent)
|
fmt.Printf("%s}\n", indent.String())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"git.wntrmute.dev/kyle/goutils/die"
|
"git.wntrmute.dev/kyle/goutils/die"
|
||||||
)
|
)
|
||||||
|
|
||||||
// size of a kilobit in bytes
|
// size of a kilobit in bytes.
|
||||||
const kilobit = 128
|
const kilobit = 128
|
||||||
const pageSize = 4096
|
const pageSize = 4096
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ func main() {
|
|||||||
fillByte := uint8(*fill)
|
fillByte := uint8(*fill)
|
||||||
|
|
||||||
buf := make([]byte, pageSize)
|
buf := make([]byte, pageSize)
|
||||||
for i := 0; i < pageSize; i++ {
|
for i := range pageSize {
|
||||||
buf[i] = fillByte
|
buf[i] = fillByte
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ func main() {
|
|||||||
die.If(err)
|
die.If(err)
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
for i := 0; i < pages; i++ {
|
for range pages {
|
||||||
_, err = file.Write(buf)
|
_, err = file.Write(buf)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ func main() {
|
|||||||
var fmtStr string
|
var fmtStr string
|
||||||
|
|
||||||
if !*quiet {
|
if !*quiet {
|
||||||
maxLine := fmt.Sprintf("%d", len(lines))
|
maxLine := strconv.Itoa(len(lines))
|
||||||
fmtStr = fmt.Sprintf("%%0%dd: %%s", len(maxLine))
|
fmtStr = fmt.Sprintf("%%0%dd: %%s", len(maxLine))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +100,6 @@ func usage() {
|
|||||||
-h Print this help message.
|
-h Print this help message.
|
||||||
-n Don't prettify; only perform validation.
|
-n Don't prettify; only perform validation.
|
||||||
`, progname, progname)
|
`, progname, progname)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -40,14 +40,14 @@ func main() {
|
|||||||
usage()
|
usage()
|
||||||
}
|
}
|
||||||
|
|
||||||
min, err := strconv.Atoi(flag.Arg(1))
|
minVal, err := strconv.Atoi(flag.Arg(1))
|
||||||
dieIf(err)
|
dieIf(err)
|
||||||
|
|
||||||
max, err := strconv.Atoi(flag.Arg(2))
|
maxVal, err := strconv.Atoi(flag.Arg(2))
|
||||||
dieIf(err)
|
dieIf(err)
|
||||||
|
|
||||||
code := kind << 6
|
code := kind << 6
|
||||||
code += (min << 3)
|
code += (minVal << 3)
|
||||||
code += max
|
code += maxVal
|
||||||
fmt.Fprintf(os.Stdout, "%0o\n", code)
|
fmt.Fprintf(os.Stdout, "%0o\n", code)
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,6 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
@@ -47,7 +46,7 @@ func help(w io.Writer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func loadDatabase() {
|
func loadDatabase() {
|
||||||
data, err := ioutil.ReadFile(dbFile)
|
data, err := os.ReadFile(dbFile)
|
||||||
if err != nil && os.IsNotExist(err) {
|
if err != nil && os.IsNotExist(err) {
|
||||||
partsDB = &database{
|
partsDB = &database{
|
||||||
Version: dbVersion,
|
Version: dbVersion,
|
||||||
@@ -74,7 +73,7 @@ func writeDB() {
|
|||||||
data, err := json.Marshal(partsDB)
|
data, err := json.Marshal(partsDB)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
err = ioutil.WriteFile(dbFile, data, 0644)
|
err = os.WriteFile(dbFile, data, 0644)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,14 +4,13 @@ import (
|
|||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ext = ".bin"
|
var ext = ".bin"
|
||||||
|
|
||||||
func stripPEM(path string) error {
|
func stripPEM(path string) error {
|
||||||
data, err := ioutil.ReadFile(path)
|
data, err := os.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -22,7 +21,7 @@ func stripPEM(path string) error {
|
|||||||
fmt.Fprintf(os.Stderr, " (only the first object will be decoded)\n")
|
fmt.Fprintf(os.Stderr, " (only the first object will be decoded)\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
return ioutil.WriteFile(path+ext, p.Bytes, 0644)
|
return os.WriteFile(path+ext, p.Bytes, 0644)
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ func main() {
|
|||||||
lib.Err(lib.ExitFailure, err, "failed to read input")
|
lib.Err(lib.ExitFailure, err, "failed to read input")
|
||||||
}
|
}
|
||||||
case argc > 1:
|
case argc > 1:
|
||||||
for i := 0; i < argc; i++ {
|
for i := range argc {
|
||||||
path := flag.Arg(i)
|
path := flag.Arg(i)
|
||||||
err = copyFile(path, buf)
|
err = copyFile(path, buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintf(os.Stdout, "[+] %s:\n", fileName)
|
fmt.Fprintf(os.Stdout, "[+] %s:\n", fileName)
|
||||||
rest := data[:]
|
rest := data
|
||||||
for {
|
for {
|
||||||
var p *pem.Block
|
var p *pem.Block
|
||||||
p, rest = pem.Decode(rest)
|
p, rest = pem.Decode(rest)
|
||||||
@@ -43,7 +43,7 @@ func newName(path string) (string, error) {
|
|||||||
return hashName(path, encodedHash), nil
|
return hashName(path, encodedHash), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func move(dst, src string, force bool) (err error) {
|
func move(dst, src string, force bool) error {
|
||||||
if fileutil.FileDoesExist(dst) && !force {
|
if fileutil.FileDoesExist(dst) && !force {
|
||||||
return fmt.Errorf("%s exists (pass the -f flag to overwrite)", dst)
|
return fmt.Errorf("%s exists (pass the -f flag to overwrite)", dst)
|
||||||
}
|
}
|
||||||
@@ -52,21 +52,23 @@ func move(dst, src string, force bool) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func(e error) {
|
var retErr error
|
||||||
|
defer func(e *error) {
|
||||||
dstFile.Close()
|
dstFile.Close()
|
||||||
if e != nil {
|
if *e != nil {
|
||||||
os.Remove(dst)
|
os.Remove(dst)
|
||||||
}
|
}
|
||||||
}(err)
|
}(&retErr)
|
||||||
|
|
||||||
srcFile, err := os.Open(src)
|
srcFile, err := os.Open(src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
retErr = err
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer srcFile.Close()
|
defer srcFile.Close()
|
||||||
|
|
||||||
_, err = io.Copy(dstFile, srcFile)
|
if _, err = io.Copy(dstFile, srcFile); err != nil {
|
||||||
if err != nil {
|
retErr = err
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ func rollDie(count, sides int) []int {
|
|||||||
sum := 0
|
sum := 0
|
||||||
var rolls []int
|
var rolls []int
|
||||||
|
|
||||||
for i := 0; i < count; i++ {
|
for range count {
|
||||||
roll := rand.IntN(sides) + 1
|
roll := rand.IntN(sides) + 1
|
||||||
sum += roll
|
sum += roll
|
||||||
rolls = append(rolls, roll)
|
rolls = append(rolls, roll)
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ func init() {
|
|||||||
project = wd[len(gopath):]
|
project = wd[len(gopath):]
|
||||||
}
|
}
|
||||||
|
|
||||||
func walkFile(path string, info os.FileInfo, err error) error {
|
func walkFile(path string, _ os.FileInfo, err error) error {
|
||||||
if ignores[path] {
|
if ignores[path] {
|
||||||
return filepath.SkipDir
|
return filepath.SkipDir
|
||||||
}
|
}
|
||||||
@@ -62,13 +62,17 @@ func walkFile(path string, info os.FileInfo, err error) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
debug.Println(path)
|
|
||||||
|
|
||||||
f, err := parser.ParseFile(fset, path, nil, parser.ImportsOnly)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug.Println(path)
|
||||||
|
|
||||||
|
f, err2 := parser.ParseFile(fset, path, nil, parser.ImportsOnly)
|
||||||
|
if err2 != nil {
|
||||||
|
return err2
|
||||||
|
}
|
||||||
|
|
||||||
for _, importSpec := range f.Imports {
|
for _, importSpec := range f.Imports {
|
||||||
importPath := strings.Trim(importSpec.Path.Value, `"`)
|
importPath := strings.Trim(importSpec.Path.Value, `"`)
|
||||||
if stdLibRegexp.MatchString(importPath) {
|
if stdLibRegexp.MatchString(importPath) {
|
||||||
@@ -102,7 +106,7 @@ func main() {
|
|||||||
ignores["vendor"] = true
|
ignores["vendor"] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, word := range strings.Split(ignoreLine, ",") {
|
for word := range strings.SplitSeq(ignoreLine, ",") {
|
||||||
ignores[strings.TrimSpace(word)] = true
|
ignores[strings.TrimSpace(word)] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func init() {
|
|||||||
flag.Usage = func() { usage(os.Stderr) }
|
flag.Usage = func() { usage(os.Stderr) }
|
||||||
}
|
}
|
||||||
|
|
||||||
func parse(path string) (public []byte, kt, ft string) {
|
func parse(path string) ([]byte, string, string) {
|
||||||
data, err := os.ReadFile(path)
|
data, err := os.ReadFile(path)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
@@ -54,6 +54,12 @@ func parse(path string) (public []byte, kt, ft string) {
|
|||||||
|
|
||||||
data = p.Bytes
|
data = p.Bytes
|
||||||
|
|
||||||
|
var (
|
||||||
|
public []byte
|
||||||
|
kt string
|
||||||
|
ft string
|
||||||
|
)
|
||||||
|
|
||||||
switch p.Type {
|
switch p.Type {
|
||||||
case "PRIVATE KEY", "RSA PRIVATE KEY", "EC PRIVATE KEY":
|
case "PRIVATE KEY", "RSA PRIVATE KEY", "EC PRIVATE KEY":
|
||||||
public, kt = parseKey(data)
|
public, kt = parseKey(data)
|
||||||
@@ -68,10 +74,10 @@ func parse(path string) (public []byte, kt, ft string) {
|
|||||||
die.With("unknown PEM type %s", p.Type)
|
die.With("unknown PEM type %s", p.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return public, kt, ft
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseKey(data []byte) (public []byte, kt string) {
|
func parseKey(data []byte) ([]byte, string) {
|
||||||
privInterface, err := x509.ParsePKCS8PrivateKey(data)
|
privInterface, err := x509.ParsePKCS8PrivateKey(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
privInterface, err = x509.ParsePKCS1PrivateKey(data)
|
privInterface, err = x509.ParsePKCS1PrivateKey(data)
|
||||||
@@ -84,6 +90,7 @@ func parseKey(data []byte) (public []byte, kt string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var priv crypto.Signer
|
var priv crypto.Signer
|
||||||
|
var kt string
|
||||||
switch p := privInterface.(type) {
|
switch p := privInterface.(type) {
|
||||||
case *rsa.PrivateKey:
|
case *rsa.PrivateKey:
|
||||||
priv = p
|
priv = p
|
||||||
@@ -95,17 +102,18 @@ func parseKey(data []byte) (public []byte, kt string) {
|
|||||||
die.With("unknown private key type %T", privInterface)
|
die.With("unknown private key type %T", privInterface)
|
||||||
}
|
}
|
||||||
|
|
||||||
public, err = x509.MarshalPKIXPublicKey(priv.Public())
|
public, err := x509.MarshalPKIXPublicKey(priv.Public())
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
return
|
return public, kt
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseCertificate(data []byte) (public []byte, kt string) {
|
func parseCertificate(data []byte) ([]byte, string) {
|
||||||
cert, err := x509.ParseCertificate(data)
|
cert, err := x509.ParseCertificate(data)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
pub := cert.PublicKey
|
pub := cert.PublicKey
|
||||||
|
var kt string
|
||||||
switch pub.(type) {
|
switch pub.(type) {
|
||||||
case *rsa.PublicKey:
|
case *rsa.PublicKey:
|
||||||
kt = "RSA"
|
kt = "RSA"
|
||||||
@@ -115,16 +123,17 @@ func parseCertificate(data []byte) (public []byte, kt string) {
|
|||||||
die.With("unknown public key type %T", pub)
|
die.With("unknown public key type %T", pub)
|
||||||
}
|
}
|
||||||
|
|
||||||
public, err = x509.MarshalPKIXPublicKey(pub)
|
public, err := x509.MarshalPKIXPublicKey(pub)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
return
|
return public, kt
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseCSR(data []byte) (public []byte, kt string) {
|
func parseCSR(data []byte) ([]byte, string) {
|
||||||
csr, err := x509.ParseCertificateRequest(data)
|
csr, err := x509.ParseCertificateRequest(data)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
pub := csr.PublicKey
|
pub := csr.PublicKey
|
||||||
|
var kt string
|
||||||
switch pub.(type) {
|
switch pub.(type) {
|
||||||
case *rsa.PublicKey:
|
case *rsa.PublicKey:
|
||||||
kt = "RSA"
|
kt = "RSA"
|
||||||
@@ -134,16 +143,18 @@ func parseCSR(data []byte) (public []byte, kt string) {
|
|||||||
die.With("unknown public key type %T", pub)
|
die.With("unknown public key type %T", pub)
|
||||||
}
|
}
|
||||||
|
|
||||||
public, err = x509.MarshalPKIXPublicKey(pub)
|
public, err := x509.MarshalPKIXPublicKey(pub)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
return
|
return public, kt
|
||||||
}
|
}
|
||||||
|
|
||||||
func dumpHex(in []byte) string {
|
func dumpHex(in []byte) string {
|
||||||
var s string
|
var s string
|
||||||
|
var sSb153 strings.Builder
|
||||||
for i := range in {
|
for i := range in {
|
||||||
s += fmt.Sprintf("%02X:", in[i])
|
sSb153.WriteString(fmt.Sprintf("%02X:", in[i]))
|
||||||
}
|
}
|
||||||
|
s += sSb153.String()
|
||||||
|
|
||||||
return strings.Trim(s, ":")
|
return strings.Trim(s, ":")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import (
|
|||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
@@ -23,7 +22,7 @@ func main() {
|
|||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if sysRoot != "" {
|
if sysRoot != "" {
|
||||||
pemList, err := ioutil.ReadFile(sysRoot)
|
pemList, err := os.ReadFile(sysRoot)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
roots := x509.NewCertPool()
|
roots := x509.NewCertPool()
|
||||||
@@ -61,7 +60,7 @@ func main() {
|
|||||||
chain = append(chain, pem.EncodeToMemory(p)...)
|
chain = append(chain, pem.EncodeToMemory(p)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ioutil.WriteFile(site+".pem", chain, 0644)
|
err = os.WriteFile(site+".pem", chain, 0644)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
fmt.Printf("[+] wrote %s.pem.\n", site)
|
fmt.Printf("[+] wrote %s.pem.\n", site)
|
||||||
}
|
}
|
||||||
@@ -75,18 +75,17 @@ func matchDigests(paths []string, issuer bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var invalid int
|
var invalid int
|
||||||
for {
|
for len(paths) > 0 {
|
||||||
if len(paths) == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
fst := paths[0]
|
fst := paths[0]
|
||||||
snd := paths[1]
|
snd := paths[1]
|
||||||
paths = paths[2:]
|
paths = paths[2:]
|
||||||
|
|
||||||
fstCert, err := certlib.LoadCertificate(fst)
|
fstCert, err := certlib.LoadCertificate(fst)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
sndCert, err := certlib.LoadCertificate(snd)
|
sndCert, err := certlib.LoadCertificate(snd)
|
||||||
die.If(err)
|
die.If(err)
|
||||||
|
|
||||||
if !bytes.Equal(getSubjectInfoHash(fstCert, issuer), getSubjectInfoHash(sndCert, issuer)) {
|
if !bytes.Equal(getSubjectInfoHash(fstCert, issuer), getSubjectInfoHash(sndCert, issuer)) {
|
||||||
_, _ = lib.Warnx("certificates don't match: %s and %s", fst, snd)
|
_, _ = lib.Warnx("certificates don't match: %s and %s", fst, snd)
|
||||||
invalid++
|
invalid++
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ func printConnectionDetails(state tls.ConnectionState) {
|
|||||||
|
|
||||||
func tlsVersion(version uint16) string {
|
func tlsVersion(version uint16) string {
|
||||||
switch version {
|
switch version {
|
||||||
|
|
||||||
case tls.VersionTLS13:
|
case tls.VersionTLS13:
|
||||||
return "TLS 1.3"
|
return "TLS 1.3"
|
||||||
case tls.VersionTLS12:
|
case tls.VersionTLS12:
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ const (
|
|||||||
curveP521
|
curveP521
|
||||||
)
|
)
|
||||||
|
|
||||||
func getECCurve(pub interface{}) int {
|
func getECCurve(pub any) int {
|
||||||
switch pub := pub.(type) {
|
switch pub := pub.(type) {
|
||||||
case *ecdsa.PublicKey:
|
case *ecdsa.PublicKey:
|
||||||
switch pub.Curve {
|
switch pub.Curve {
|
||||||
@@ -152,7 +152,6 @@ func loadKey(path string) (crypto.Signer, error) {
|
|||||||
// should never reach here
|
// should never reach here
|
||||||
return nil, errors.New("invalid private key")
|
return nil, errors.New("invalid private key")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -201,10 +201,6 @@ func init() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if fromLoc == time.UTC {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
toLoc = time.UTC
|
toLoc = time.UTC
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
@@ -12,7 +11,7 @@ import (
|
|||||||
|
|
||||||
type empty struct{}
|
type empty struct{}
|
||||||
|
|
||||||
func errorf(format string, args ...interface{}) {
|
func errorf(format string, args ...any) {
|
||||||
format += "\n"
|
format += "\n"
|
||||||
fmt.Fprintf(os.Stderr, format, args...)
|
fmt.Fprintf(os.Stderr, format, args...)
|
||||||
}
|
}
|
||||||
@@ -44,7 +43,7 @@ func main() {
|
|||||||
|
|
||||||
if flag.NArg() == 1 && flag.Arg(0) == "-" {
|
if flag.NArg() == 1 && flag.Arg(0) == "-" {
|
||||||
path := "stdin"
|
path := "stdin"
|
||||||
in, err := ioutil.ReadAll(os.Stdin)
|
in, err := io.ReadAll(os.Stdin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errorf("%s FAILED: %s", path, err)
|
errorf("%s FAILED: %s", path, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
@@ -65,7 +64,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, path := range flag.Args() {
|
for _, path := range flag.Args() {
|
||||||
in, err := ioutil.ReadFile(path)
|
in, err := os.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errorf("%s FAILED: %s", path, err)
|
errorf("%s FAILED: %s", path, err)
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import (
|
|||||||
|
|
||||||
const defaultDirectory = ".git/objects"
|
const defaultDirectory = ".git/objects"
|
||||||
|
|
||||||
func errorf(format string, a ...interface{}) {
|
func errorf(format string, a ...any) {
|
||||||
fmt.Fprintf(os.Stderr, format, a...)
|
fmt.Fprintf(os.Stderr, format, a...)
|
||||||
if format[len(format)-1] != '\n' {
|
if format[len(format)-1] != '\n' {
|
||||||
fmt.Fprintf(os.Stderr, "\n")
|
fmt.Fprintf(os.Stderr, "\n")
|
||||||
@@ -93,7 +93,7 @@ func searchFile(path string, search *regexp.Regexp) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func buildWalker(searchExpr *regexp.Regexp) filepath.WalkFunc {
|
func buildWalker(searchExpr *regexp.Regexp) filepath.WalkFunc {
|
||||||
return func(path string, info os.FileInfo, err error) error {
|
return func(path string, info os.FileInfo, _ error) error {
|
||||||
if info.Mode().IsRegular() {
|
if info.Mode().IsRegular() {
|
||||||
return searchFile(path, searchExpr)
|
return searchFile(path, searchExpr)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// +build freebsd darwin,386 netbsd
|
//go:build bsd
|
||||||
|
|
||||||
package lib
|
package lib
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// +build unix linux openbsd darwin,amd64
|
//go:build unix || linux || openbsd || (darwin && amd64)
|
||||||
|
|
||||||
package lib
|
package lib
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ type FileTime struct {
|
|||||||
|
|
||||||
func timeSpecToTime(ts unix.Timespec) time.Time {
|
func timeSpecToTime(ts unix.Timespec) time.Time {
|
||||||
// The casts to int64 are needed because on 386, these are int32s.
|
// The casts to int64 are needed because on 386, these are int32s.
|
||||||
return time.Unix(int64(ts.Sec), int64(ts.Nsec))
|
return time.Unix(ts.Sec, ts.Nsec)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadFileTime returns a FileTime associated with the file.
|
// LoadFileTime returns a FileTime associated with the file.
|
||||||
|
|||||||
24
lib/lib.go
24
lib/lib.go
@@ -10,6 +10,12 @@ import (
|
|||||||
|
|
||||||
var progname = filepath.Base(os.Args[0])
|
var progname = filepath.Base(os.Args[0])
|
||||||
|
|
||||||
|
const (
|
||||||
|
daysInYear = 365
|
||||||
|
digitWidth = 10
|
||||||
|
hoursInQuarterDay = 6
|
||||||
|
)
|
||||||
|
|
||||||
// ProgName returns what lib thinks the program name is, namely the
|
// ProgName returns what lib thinks the program name is, namely the
|
||||||
// basename of argv0.
|
// basename of argv0.
|
||||||
//
|
//
|
||||||
@@ -20,7 +26,7 @@ func ProgName() string {
|
|||||||
|
|
||||||
// Warnx displays a formatted error message to standard error, à la
|
// Warnx displays a formatted error message to standard error, à la
|
||||||
// warnx(3).
|
// warnx(3).
|
||||||
func Warnx(format string, a ...interface{}) (int, error) {
|
func Warnx(format string, a ...any) (int, error) {
|
||||||
format = fmt.Sprintf("[%s] %s", progname, format)
|
format = fmt.Sprintf("[%s] %s", progname, format)
|
||||||
format += "\n"
|
format += "\n"
|
||||||
return fmt.Fprintf(os.Stderr, format, a...)
|
return fmt.Fprintf(os.Stderr, format, a...)
|
||||||
@@ -28,7 +34,7 @@ func Warnx(format string, a ...interface{}) (int, error) {
|
|||||||
|
|
||||||
// Warn displays a formatted error message to standard output,
|
// Warn displays a formatted error message to standard output,
|
||||||
// appending the error string, à la warn(3).
|
// appending the error string, à la warn(3).
|
||||||
func Warn(err error, format string, a ...interface{}) (int, error) {
|
func Warn(err error, format string, a ...any) (int, error) {
|
||||||
format = fmt.Sprintf("[%s] %s", progname, format)
|
format = fmt.Sprintf("[%s] %s", progname, format)
|
||||||
format += ": %v\n"
|
format += ": %v\n"
|
||||||
a = append(a, err)
|
a = append(a, err)
|
||||||
@@ -37,7 +43,7 @@ func Warn(err error, format string, a ...interface{}) (int, error) {
|
|||||||
|
|
||||||
// Errx displays a formatted error message to standard error and exits
|
// Errx displays a formatted error message to standard error and exits
|
||||||
// with the status code from `exit`, à la errx(3).
|
// with the status code from `exit`, à la errx(3).
|
||||||
func Errx(exit int, format string, a ...interface{}) {
|
func Errx(exit int, format string, a ...any) {
|
||||||
format = fmt.Sprintf("[%s] %s", progname, format)
|
format = fmt.Sprintf("[%s] %s", progname, format)
|
||||||
format += "\n"
|
format += "\n"
|
||||||
fmt.Fprintf(os.Stderr, format, a...)
|
fmt.Fprintf(os.Stderr, format, a...)
|
||||||
@@ -47,7 +53,7 @@ func Errx(exit int, format string, a ...interface{}) {
|
|||||||
// Err displays a formatting error message to standard error,
|
// Err displays a formatting error message to standard error,
|
||||||
// appending the error string, and exits with the status code from
|
// appending the error string, and exits with the status code from
|
||||||
// `exit`, à la err(3).
|
// `exit`, à la err(3).
|
||||||
func Err(exit int, err error, format string, a ...interface{}) {
|
func Err(exit int, err error, format string, a ...any) {
|
||||||
format = fmt.Sprintf("[%s] %s", progname, format)
|
format = fmt.Sprintf("[%s] %s", progname, format)
|
||||||
format += ": %v\n"
|
format += ": %v\n"
|
||||||
a = append(a, err)
|
a = append(a, err)
|
||||||
@@ -62,21 +68,21 @@ func Itoa(i int, wid int) string {
|
|||||||
// Assemble decimal in reverse order.
|
// Assemble decimal in reverse order.
|
||||||
var b [20]byte
|
var b [20]byte
|
||||||
bp := len(b) - 1
|
bp := len(b) - 1
|
||||||
for i >= 10 || wid > 1 {
|
for i >= digitWidth || wid > 1 {
|
||||||
wid--
|
wid--
|
||||||
q := i / 10
|
q := i / digitWidth
|
||||||
b[bp] = byte('0' + i - q*10)
|
b[bp] = byte('0' + i - q*digitWidth)
|
||||||
bp--
|
bp--
|
||||||
i = q
|
i = q
|
||||||
}
|
}
|
||||||
// i < 10
|
|
||||||
b[bp] = byte('0' + i)
|
b[bp] = byte('0' + i)
|
||||||
return string(b[bp:])
|
return string(b[bp:])
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
dayDuration = 24 * time.Hour
|
dayDuration = 24 * time.Hour
|
||||||
yearDuration = (365 * dayDuration) + (6 * time.Hour)
|
yearDuration = (daysInYear * dayDuration) + (hoursInQuarterDay * time.Hour)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Duration returns a prettier string for time.Durations.
|
// Duration returns a prettier string for time.Durations.
|
||||||
|
|||||||
Reference in New Issue
Block a user