mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-06 22:27:36 +02:00
In Android, we are prompting the user to select a Taildrop directory when they first receive a Taildrop: we block writes on Taildrop dir selection. This means that we cannot use Dir inside managerOptions, since the http request would not get the new Taildrop extension. This PR removes, in the Android case, the reliance on m.opts.Dir, and instead has FileOps hold the correct directory. This expands FileOps to be the Taildrop interface for all file system operations. Updates tailscale/corp#29211 Signed-off-by: kari-ts <kari@tailscale.com> restore tstest
42 lines
1.4 KiB
Go
42 lines
1.4 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
||
// SPDX-License-Identifier: BSD-3-Clause
|
||
|
||
package taildrop
|
||
|
||
import (
|
||
"io"
|
||
"io/fs"
|
||
"os"
|
||
)
|
||
|
||
// FileOps abstracts over both local‐FS paths and Android SAF URIs.
|
||
type FileOps interface {
|
||
// OpenWriter creates or truncates a file named relative to the receiver's root,
|
||
// seeking to the specified offset. If the file does not exist, it is created with mode perm
|
||
// on platforms that support it.
|
||
//
|
||
// It returns an [io.WriteCloser] and the file's absolute path, or an error.
|
||
// This call may block. Callers should avoid holding locks when calling OpenWriter.
|
||
OpenWriter(name string, offset int64, perm os.FileMode) (wc io.WriteCloser, path string, err error)
|
||
|
||
// Remove deletes a file or directory relative to the receiver's root.
|
||
// It returns [io.ErrNotExist] if the file or directory does not exist.
|
||
Remove(name string) error
|
||
|
||
// Rename atomically renames oldPath to a new file named newName,
|
||
// returning the full new path or an error.
|
||
Rename(oldPath, newName string) (newPath string, err error)
|
||
|
||
// ListFiles returns just the basenames of all regular files
|
||
// in the root directory.
|
||
ListFiles() ([]string, error)
|
||
|
||
// Stat returns the FileInfo for the given name or an error.
|
||
Stat(name string) (fs.FileInfo, error)
|
||
|
||
// OpenReader opens the given basename for the given name or an error.
|
||
OpenReader(name string) (io.ReadCloser, error)
|
||
}
|
||
|
||
var newFileOps func(dir string) (FileOps, error)
|