in internal/fs/wrappers/error_mapping.go [38:101]
func errno(err error, preconditionErrCfg bool) error {
if err == nil {
return nil
}
// Use existing em errno
var errno syscall.Errno
if errors.As(err, &errno) {
return errno
}
// The fuse op is interrupted
if errors.Is(err, context.Canceled) {
return syscall.EINTR
}
// The object is modified or deleted by a concurrent process.
var clobberedErr *gcsfuse_errors.FileClobberedError
if errors.As(err, &clobberedErr) {
if preconditionErrCfg {
return syscall.ESTALE
}
return nil
}
if errors.Is(err, storage.ErrObjectNotExist) {
return syscall.ENOENT
}
// The HTTP request is canceled
if strings.Contains(err.Error(), "net/http: request canceled") {
return syscall.ECANCELED
}
// Cannot authenticate or Permission denied.
if strings.Contains(err.Error(), "oauth2: cannot fetch token") {
return syscall.EACCES
}
if grpcStatus, ok := status.FromError(err); ok {
switch grpcStatus.Code() {
case codes.Canceled:
return syscall.EINTR
case codes.AlreadyExists:
return syscall.EEXIST
case codes.PermissionDenied, codes.Unauthenticated:
return syscall.EACCES
case codes.NotFound:
return syscall.ENOENT
}
}
// Translate API errors into an em errno
var googleApiErr *googleapi.Error
if errors.As(err, &googleApiErr) {
switch googleApiErr.Code {
case http.StatusForbidden, http.StatusUnauthorized:
return syscall.EACCES
case http.StatusNotFound:
return syscall.ENOENT
}
}
return DefaultFSError
}