--- /dev/null
+// MsgSyncReq: copy files to the remote host; Windows compatibility
+
+// Copyright (C) 2021 Simon Ruderich
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package sync
+
+import (
+ "fmt"
+ "os"
+)
+
+// Windows remote hosts are not supported. However, the local safcm binary
+// imports safcm-remote which fails to build with the regular files.go.
+
+func (s *Sync) syncFiles() error {
+ return fmt.Errorf("not implemented on Windows")
+}
+
+func OpenFileNoFollow(path string) (*os.File, error) {
+ return nil, fmt.Errorf("not implemented on Windows")
+}
via "safcm fixperms".
`
+ // No permission checks on windows which doesn't track them.
+ windows := runtime.GOOS == "windows"
+
files := make(map[string]*safcm.File)
err := filepath.WalkDir(basePath, func(path string, d fs.DirEntry,
err error) error {
// permissions they could assume that these permissions are
// respected. This is not the case.
if typ == 0 /* regular file */ {
+ if windows {
+ perm = 0644
+ // 0755 must be set via permissions.yaml if
+ // windows is used
+ }
if perm != 0644 && perm != 0755 {
return fmt.Errorf(
"%q: invalid permissions %#o%s",
return err
}
} else if typ == fs.ModeDir {
+ if windows {
+ perm = 0755
+ }
if perm != 0755 {
return fmt.Errorf(
"%q: invalid permissions %#o%s",
"log"
"os"
"os/signal"
+ "runtime"
"sort"
"strings"
"sync"
os.Exit(1)
}
+ if runtime.GOOS == "windows" {
+ log.Print("WARNING: Windows support is experimental!")
+ }
+
cfg, allHosts, allGroups, err := LoadBaseFiles()
if err != nil {
return err