all: simplify code by using modern Go constructs

Generated using modernize by running:

    go run golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize@latest -fix -test ./...

Change-Id: Ifc7d61cf6735cc53f2bdf890a338961f55075af5
Reviewed-on: https://go-review.googlesource.com/c/sys/+/661975
Auto-Submit: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
diff --git a/cpu/parse.go b/cpu/parse.go
index 762b63d..56a7e1a 100644
--- a/cpu/parse.go
+++ b/cpu/parse.go
@@ -13,7 +13,7 @@
 // https://golang.org/cl/209597.
 func parseRelease(rel string) (major, minor, patch int, ok bool) {
 	// Strip anything after a dash or plus.
-	for i := 0; i < len(rel); i++ {
+	for i := range len(rel) {
 		if rel[i] == '-' || rel[i] == '+' {
 			rel = rel[:i]
 			break
@@ -21,7 +21,7 @@
 	}
 
 	next := func() (int, bool) {
-		for i := 0; i < len(rel); i++ {
+		for i := range len(rel) {
 			if rel[i] == '.' {
 				ver, err := strconv.Atoi(rel[:i])
 				rel = rel[i+1:]
diff --git a/unix/dirent_test.go b/unix/dirent_test.go
index e47d091..f209fa1 100644
--- a/unix/dirent_test.go
+++ b/unix/dirent_test.go
@@ -107,7 +107,7 @@
 	d := t.TempDir()
 
 	var files []string
-	for i := 0; i < N; i++ {
+	for i := range N {
 		files = append(files, fmt.Sprintf("file%d", i))
 	}
 	for _, file := range files {
diff --git a/unix/fdset_test.go b/unix/fdset_test.go
index 26d05c7..7d08f69 100644
--- a/unix/fdset_test.go
+++ b/unix/fdset_test.go
@@ -15,21 +15,21 @@
 func TestFdSet(t *testing.T) {
 	var fdSet unix.FdSet
 	fdSet.Zero()
-	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
+	for fd := range unix.FD_SETSIZE {
 		if fdSet.IsSet(fd) {
 			t.Fatalf("Zero did not clear fd %d", fd)
 		}
 		fdSet.Set(fd)
 	}
 
-	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
+	for fd := range unix.FD_SETSIZE {
 		if !fdSet.IsSet(fd) {
 			t.Fatalf("IsSet(%d): expected true, got false", fd)
 		}
 	}
 
 	fdSet.Zero()
-	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
+	for fd := range unix.FD_SETSIZE {
 		if fdSet.IsSet(fd) {
 			t.Fatalf("Zero did not clear fd %d", fd)
 		}
@@ -39,7 +39,7 @@
 		fdSet.Set(fd)
 	}
 
-	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
+	for fd := range unix.FD_SETSIZE {
 		if fd&0x1 == 0x1 {
 			if !fdSet.IsSet(fd) {
 				t.Fatalf("IsSet(%d): expected true, got false", fd)
@@ -55,7 +55,7 @@
 		fdSet.Clear(fd)
 	}
 
-	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
+	for fd := range unix.FD_SETSIZE {
 		if fdSet.IsSet(fd) {
 			t.Fatalf("Clear(%d) did not clear fd", fd)
 		}
diff --git a/unix/internal/mkmerge/mkmerge.go b/unix/internal/mkmerge/mkmerge.go
index 52f1d12..06a6900 100644
--- a/unix/internal/mkmerge/mkmerge.go
+++ b/unix/internal/mkmerge/mkmerge.go
@@ -137,7 +137,7 @@
 // filter parses and filters Go source code from src, removing top
 // level declarations using keep as predicate.
 // For src parameter, please see docs for parser.ParseFile.
-func filter(src interface{}, keep filterFn) ([]byte, error) {
+func filter(src any, keep filterFn) ([]byte, error) {
 	// Parse the src into an ast
 	fset := token.NewFileSet()
 	f, err := parser.ParseFile(fset, "", src, parser.ParseComments)
@@ -243,7 +243,7 @@
 
 // getCodeSet returns the set of all top-level consts, types, and funcs from src.
 // src must be string, []byte, or io.Reader (see go/parser.ParseFile docs)
-func getCodeSet(src interface{}) (*codeSet, error) {
+func getCodeSet(src any) (*codeSet, error) {
 	set := newCodeSet()
 
 	fset := token.NewFileSet()
diff --git a/unix/internal/mkmerge/mkmerge_test.go b/unix/internal/mkmerge/mkmerge_test.go
index 2566dad..29b584d 100644
--- a/unix/internal/mkmerge/mkmerge_test.go
+++ b/unix/internal/mkmerge/mkmerge_test.go
@@ -498,7 +498,7 @@
 func addLineNr(src []byte) []byte {
 	lines := bytes.Split(src, []byte("\n"))
 	for i, line := range lines {
-		lines[i] = []byte(fmt.Sprintf("%d: %s", i+1, line))
+		lines[i] = fmt.Appendf(nil, "%d: %s", i+1, line)
 	}
 	return bytes.Join(lines, []byte("\n"))
 }
diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go
index 230a945..4958a65 100644
--- a/unix/syscall_linux.go
+++ b/unix/syscall_linux.go
@@ -13,6 +13,7 @@
 
 import (
 	"encoding/binary"
+	"slices"
 	"strconv"
 	"syscall"
 	"time"
@@ -417,7 +418,7 @@
 		return nil, 0, EINVAL
 	}
 	sa.raw.Family = AF_UNIX
-	for i := 0; i < n; i++ {
+	for i := range n {
 		sa.raw.Path[i] = int8(name[i])
 	}
 	// length is family (uint16), name, NUL.
@@ -507,7 +508,7 @@
 	psm := (*[2]byte)(unsafe.Pointer(&sa.raw.Psm))
 	psm[0] = byte(sa.PSM)
 	psm[1] = byte(sa.PSM >> 8)
-	for i := 0; i < len(sa.Addr); i++ {
+	for i := range len(sa.Addr) {
 		sa.raw.Bdaddr[i] = sa.Addr[len(sa.Addr)-1-i]
 	}
 	cid := (*[2]byte)(unsafe.Pointer(&sa.raw.Cid))
@@ -589,11 +590,11 @@
 	sa.raw.Family = AF_CAN
 	sa.raw.Ifindex = int32(sa.Ifindex)
 	rx := (*[4]byte)(unsafe.Pointer(&sa.RxID))
-	for i := 0; i < 4; i++ {
+	for i := range 4 {
 		sa.raw.Addr[i] = rx[i]
 	}
 	tx := (*[4]byte)(unsafe.Pointer(&sa.TxID))
-	for i := 0; i < 4; i++ {
+	for i := range 4 {
 		sa.raw.Addr[i+4] = tx[i]
 	}
 	return unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil
@@ -618,11 +619,11 @@
 	sa.raw.Family = AF_CAN
 	sa.raw.Ifindex = int32(sa.Ifindex)
 	n := (*[8]byte)(unsafe.Pointer(&sa.Name))
-	for i := 0; i < 8; i++ {
+	for i := range 8 {
 		sa.raw.Addr[i] = n[i]
 	}
 	p := (*[4]byte)(unsafe.Pointer(&sa.PGN))
-	for i := 0; i < 4; i++ {
+	for i := range 4 {
 		sa.raw.Addr[i+8] = p[i]
 	}
 	sa.raw.Addr[12] = sa.Addr
@@ -911,7 +912,7 @@
 	// These are EBCDIC encoded by the kernel, but we still need to pad them
 	// with blanks. Initializing with blanks allows the caller to feed in either
 	// a padded or an unpadded string.
-	for i := 0; i < 8; i++ {
+	for i := range 8 {
 		sa.raw.Nodeid[i] = ' '
 		sa.raw.User_id[i] = ' '
 		sa.raw.Name[i] = ' '
@@ -1148,7 +1149,7 @@
 		var user [8]byte
 		var name [8]byte
 
-		for i := 0; i < 8; i++ {
+		for i := range 8 {
 			user[i] = byte(pp.User_id[i])
 			name[i] = byte(pp.Name[i])
 		}
@@ -1173,11 +1174,11 @@
 				Ifindex: int(pp.Ifindex),
 			}
 			name := (*[8]byte)(unsafe.Pointer(&sa.Name))
-			for i := 0; i < 8; i++ {
+			for i := range 8 {
 				name[i] = pp.Addr[i]
 			}
 			pgn := (*[4]byte)(unsafe.Pointer(&sa.PGN))
-			for i := 0; i < 4; i++ {
+			for i := range 4 {
 				pgn[i] = pp.Addr[i+8]
 			}
 			addr := (*[1]byte)(unsafe.Pointer(&sa.Addr))
@@ -1188,11 +1189,11 @@
 				Ifindex: int(pp.Ifindex),
 			}
 			rx := (*[4]byte)(unsafe.Pointer(&sa.RxID))
-			for i := 0; i < 4; i++ {
+			for i := range 4 {
 				rx[i] = pp.Addr[i]
 			}
 			tx := (*[4]byte)(unsafe.Pointer(&sa.TxID))
-			for i := 0; i < 4; i++ {
+			for i := range 4 {
 				tx[i] = pp.Addr[i+4]
 			}
 			return sa, nil
@@ -2216,10 +2217,7 @@
 		return
 	}
 	for i := 0; n > 0 && i < len(iovecs); i++ {
-		m := int(iovecs[i].Len)
-		if m > n {
-			m = n
-		}
+		m := min(int(iovecs[i].Len), n)
 		n -= m
 		if m > 0 {
 			raceWriteRange(unsafe.Pointer(iovecs[i].Base), m)
@@ -2270,10 +2268,7 @@
 		return
 	}
 	for i := 0; n > 0 && i < len(iovecs); i++ {
-		m := int(iovecs[i].Len)
-		if m > n {
-			m = n
-		}
+		m := min(int(iovecs[i].Len), n)
 		n -= m
 		if m > 0 {
 			raceReadRange(unsafe.Pointer(iovecs[i].Base), m)
@@ -2320,12 +2315,7 @@
 		return false
 	}
 
-	for _, g := range groups {
-		if g == gid {
-			return true
-		}
-	}
-	return false
+	return slices.Contains(groups, gid)
 }
 
 func isCapDacOverrideSet() bool {
diff --git a/unix/syscall_linux_test.go b/unix/syscall_linux_test.go
index d4ed887..d3075ca 100644
--- a/unix/syscall_linux_test.go
+++ b/unix/syscall_linux_test.go
@@ -367,7 +367,7 @@
 
 	var now time.Time
 
-	for i := 0; i < 10; i++ {
+	for range 10 {
 		ut, err = unix.Time(nil)
 		if err != nil {
 			t.Fatalf("Time: %v", err)
@@ -555,7 +555,7 @@
 	cpu = 1
 	if !oldMask.IsSet(cpu) {
 		newMask.Zero()
-		for i := 0; i < len(oldMask); i++ {
+		for i := range len(oldMask) {
 			if oldMask.IsSet(i) {
 				newMask.Set(i)
 				break
@@ -878,7 +878,7 @@
 	}
 	defer mi.Close()
 	bs := bufio.NewScanner(mi)
-	wantPrefix := []byte(fmt.Sprintf("%v ", mountID))
+	wantPrefix := fmt.Appendf(nil, "%v ", mountID)
 	for bs.Scan() {
 		if !bytes.HasPrefix(bs.Bytes(), wantPrefix) {
 			continue
diff --git a/unix/xattr_test.go b/unix/xattr_test.go
index dfa208f..3b51114 100644
--- a/unix/xattr_test.go
+++ b/unix/xattr_test.go
@@ -10,6 +10,7 @@
 	"os"
 	"path/filepath"
 	"runtime"
+	"slices"
 	"strings"
 	"testing"
 
@@ -62,13 +63,7 @@
 		// name and Listxattr doesn't return the namespace prefix.
 		xattrWant = strings.TrimPrefix(xattrWant, "user.")
 	}
-	found := false
-	for _, name := range xattrs {
-		if name == xattrWant {
-			found = true
-			break
-		}
-	}
+	found := slices.Contains(xattrs, xattrWant)
 
 	if !found {
 		t.Errorf("Listxattr did not return previously set attribute %q in attributes %v", xattrName, xattrs)
@@ -170,13 +165,7 @@
 		// name and Listxattr doesn't return the namespace prefix.
 		xattrWant = strings.TrimPrefix(xattrWant, "user.")
 	}
-	found := false
-	for _, name := range xattrs {
-		if name == xattrWant {
-			found = true
-			break
-		}
-	}
+	found := slices.Contains(xattrs, xattrWant)
 
 	if !found {
 		t.Errorf("Flistxattr did not return previously set attribute %q in attributes %v", xattrName, xattrs)