func errno()

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
}