feat: full NFSv4.2 server and client in pure Go
Test / test (push) Successful in 2m4s
Release / gates (push) Successful in 2m5s
Release / build (amd64, freebsd) (push) Successful in 1m27s
Release / build (amd64, linux) (push) Successful in 1m22s
Release / build (amd64, netbsd) (push) Successful in 1m19s
Release / build (amd64, openbsd) (push) Successful in 1m20s
Release / build (arm64, darwin) (push) Successful in 1m21s
Release / build (arm64, freebsd) (push) Successful in 1m26s
Release / build (arm64, linux) (push) Successful in 1m25s
Release / build (arm64, netbsd) (push) Successful in 1m31s
Release / build (arm64, openbsd) (push) Successful in 1m27s
Release / build (loong64, linux) (push) Successful in 1m37s
Release / build (riscv64, linux) (push) Successful in 1m21s
Release / release (push) Successful in 40s
Test / test (push) Successful in 2m4s
Release / gates (push) Successful in 2m5s
Release / build (amd64, freebsd) (push) Successful in 1m27s
Release / build (amd64, linux) (push) Successful in 1m22s
Release / build (amd64, netbsd) (push) Successful in 1m19s
Release / build (amd64, openbsd) (push) Successful in 1m20s
Release / build (arm64, darwin) (push) Successful in 1m21s
Release / build (arm64, freebsd) (push) Successful in 1m26s
Release / build (arm64, linux) (push) Successful in 1m25s
Release / build (arm64, netbsd) (push) Successful in 1m31s
Release / build (arm64, openbsd) (push) Successful in 1m27s
Release / build (loong64, linux) (push) Successful in 1m37s
Release / build (riscv64, linux) (push) Successful in 1m21s
Release / release (push) Successful in 40s
Assisted-by: GLM 5.3 Flash
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// The extended attribute operations of RFC 8276: four narrow operations
|
||||
// over named opaque values.
|
||||
|
||||
package nfs4
|
||||
|
||||
import (
|
||||
"sourcedock.dev/petrbalvin/nfs/internal/xdr"
|
||||
)
|
||||
|
||||
// SETXATTR modes of the setxattr4mode4 enum.
|
||||
const (
|
||||
SetXattrUnchecked = 0
|
||||
SetXattrCreate = 1
|
||||
SetXattrReplace = 2
|
||||
)
|
||||
|
||||
// AppendGetXattrArgs appends the GETXATTR argop: the name alone, the
|
||||
// whole argument RFC 8276 defines.
|
||||
func AppendGetXattrArgs(b []byte, name string) []byte {
|
||||
b = xdr.AppendUint32(b, OpGetxattr)
|
||||
return xdr.AppendString(b, name)
|
||||
}
|
||||
|
||||
// AppendGetXattrRes appends a successful GETXATTR result: the value as
|
||||
// one opaque.
|
||||
func AppendGetXattrRes(b []byte, value []byte) []byte {
|
||||
return xdr.AppendVarOpaque(b, value)
|
||||
}
|
||||
|
||||
// DecodeGetXattrRes decodes a successful GETXATTR result.
|
||||
func DecodeGetXattrRes(body []byte) ([]byte, error) {
|
||||
return xdr.NewDecoder(body).VarOpaque()
|
||||
}
|
||||
|
||||
// AppendSetXattrArgs appends the SETXATTR argop: the create mode, the
|
||||
// name and the value.
|
||||
func AppendSetXattrArgs(b []byte, mode uint32, name string, value []byte) []byte {
|
||||
b = xdr.AppendUint32(b, OpSetxattr)
|
||||
b = xdr.AppendUint32(b, mode)
|
||||
b = xdr.AppendString(b, name)
|
||||
return xdr.AppendVarOpaque(b, value)
|
||||
}
|
||||
|
||||
// AppendListXattrArgs appends the LISTXATTR argop: the cookie the last
|
||||
// reply returned and the response size budget.
|
||||
func AppendListXattrArgs(b []byte, cookie uint64, maxcount uint32) []byte {
|
||||
b = xdr.AppendUint32(b, OpListxattr)
|
||||
b = xdr.AppendUint64(b, cookie)
|
||||
return xdr.AppendUint32(b, maxcount)
|
||||
}
|
||||
|
||||
// AppendListXattrRes appends a successful LISTXATTR result: the cookie
|
||||
// of the last name, the names and the end of list flag.
|
||||
func AppendListXattrRes(b []byte, cookie uint64, names []string, eof bool) []byte {
|
||||
b = xdr.AppendUint64(b, cookie)
|
||||
b = xdr.AppendUint32(b, uint32(len(names)))
|
||||
for _, n := range names {
|
||||
b = xdr.AppendString(b, n)
|
||||
}
|
||||
return xdr.AppendBool(b, eof)
|
||||
}
|
||||
|
||||
// AppendRemoveXattrArgs appends the REMOVEXATTR argop: the name.
|
||||
func AppendRemoveXattrArgs(b []byte, name string) []byte {
|
||||
b = xdr.AppendUint32(b, OpRemovexattr)
|
||||
return xdr.AppendString(b, name)
|
||||
}
|
||||
Reference in New Issue
Block a user