@@ -9,8 +9,10 @@ import (
99 "fmt"
1010 "io"
1111 "net"
12+ "os"
1213 "path/filepath"
1314 "strings"
15+ "sync"
1416 "time"
1517
1618 "github.com/SierraSoftworks/multicast/v2"
@@ -26,7 +28,10 @@ type Client struct {
2628 ID string
2729 tasks * ttlcache.Cache [string , chan net.Conn ]
2830
29- PWD string // 也有可能是文件, 用途是用于限制文件访问
31+ PWD string
32+ targets []string
33+ targetsInit * sync.Once
34+
3035 Logger func (file * File , err error )
3136 closed * multicast.Channel [any ]
3237
@@ -78,7 +83,6 @@ func (c *Client) Open(r *bufio.Reader, version string, id string) (err error) {
7883
7984func (c * Client ) intFlag (version string ) * flag.FlagSet {
8085 f := flag .NewFlagSet ("lcode@" + version , flag .ContinueOnError )
81- f .StringVar (& c .PWD , "pwd" , "." , "工作目录" )
8286 f .StringVar (& c .ServerAddr , "server" , c .conn .LocalAddr ().String (), "server addr" )
8387 f .Bool ("x" , true , "仅用以分割bash参数, 不作其他用途" )
8488 return f
@@ -102,9 +106,7 @@ func (c *Client) parseArgs(r *bufio.Reader, version string) (err error) {
102106 return
103107 }
104108
105- if f .Arg (0 ) != "" {
106- f .Set ("pwd" , f .Arg (0 ))
107- }
109+ c .targets = f .Args ()
108110 return
109111}
110112
@@ -153,24 +155,42 @@ func (c *Client) initPWD(r *bufio.Reader) (err error) {
153155 defer err2 .Handle (& err , func () {
154156 c .log (fmt .Errorf ("init pwd failed: %w" , err ))
155157 })
156- cmd := fmt .Sprintf ("TZ=UTC0 ls -Ald --full-time %s || echo /dev/null | head -n 1\n " , shellescape .Quote (c .PWD ))
157- To1 (io .WriteString (c .conn , cmd ))
158- line , _ := To2 (r .ReadLine ())
159- if string (line ) == "/dev/null" {
160- err = ErrEditTargetNotExists
161- return
162- }
163- f := parseLsLine (line )
164- if strings .HasPrefix (f .sys [7 ], "/" ) {
165- c .PWD = f .sys [7 ]
166- return
167- }
168158 To1 (io .WriteString (c .conn , "pwd\n " ))
169159 pwd , _ := To2 (r .ReadLine ())
170- c .PWD = filepath .Join (string (pwd ), f .name )
160+ c .PWD = string (pwd )
161+ c .targetsInit = & sync.Once {}
171162 return
172163}
173164
165+ // 要编辑的目标文件, 用途是用于限制文件访问
166+ func (c * Client ) Targets () []string {
167+ c .targetsInit .Do (func () {
168+ if len (c .targets ) == 0 {
169+ c .targets = []string {c .PWD }
170+ return
171+ }
172+ var targets = make ([]string , 0 )
173+ defer func () { c .targets = targets }()
174+ for _ , t := range c .targets {
175+ f := OpenFile (c , t )
176+ stat , err := f .Stat ()
177+ switch {
178+ case errors .Is (err , os .ErrNotExist ):
179+ targets = append (targets , "/dev/null" + t )
180+ case err != nil :
181+ targets = append (targets , "/dev/err" + t )
182+ default :
183+ fullpath := stat .Sys ().([]string )[7 ]
184+ if ! strings .HasPrefix (fullpath , "/" ) {
185+ fullpath = filepath .Join (c .PWD , fullpath )
186+ }
187+ targets = append (targets , fullpath )
188+ }
189+ }
190+ })
191+ return c .targets
192+ }
193+
174194func (c * Client ) Close () {
175195 c .tasks .DeleteAll ()
176196 c .tasks .Stop ()
0 commit comments