Loading go.sum 0 → 100644 +45 −0 Original line number Diff line number Diff line github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/minio/minio-go v1.0.0 h1:ooSujki+Z1PRGZsYffJw5jnF5eMBvzMVV86TLAlM0UM= github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o= github.com/minio/minio-go/v6 v6.0.56 h1:H4+v6UFV1V7VkEf1HjL15W9OvTL1Gy8EbMmjQZHqEbg= github.com/minio/minio-go/v6 v6.0.56/go.mod h1:KQMM+/44DSlSGSQWSfRrAZ12FVMmpWNuX37i2AX0jfI= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= main.go +6 −44 Original line number Diff line number Diff line Loading @@ -9,12 +9,11 @@ package main import ( "fmt" "io" "log" "net" "rsync2os/rsync" "sort" "strings" ) // type FList struct { Loading @@ -35,47 +34,10 @@ func Client() { defer conn.Close() // send my version // send("@RSYNCD: 31.0\n"); conn.Write([]byte("@RSYNCD: 27.0\n")) // receive server's protocol version and seed version_str, _ := rsync.ReadLine(conn) var remote_protocol, remote_sub int fmt.Sscanf(version_str, "@RSYNCD: %d.%d", remote_protocol, remote_sub) fmt.Println(version_str) // recv(version) // scanf(version, "@RSYNCD: %d.%d", ) // send mod name // send("Foo\n") conn.Write([]byte("epel\n")) // conn.Write([]byte("\n")) for { // Wait for '@RSYNCD: OK': until \n, then add \0 res, _ := rsync.ReadLine(conn) fmt.Print(res) if strings.HasPrefix(res, "@RSYNCD: OK") { break } } // send parameters list //conn.Write([]byte("--server\n--sender\n-g\n-l\n-o\n-p\n-D\n-r\n-t\n.\nepel/7/SRPMS\n\n")) conn.Write([]byte("--server\n--sender\n-l\n-p\n-r\n-t\n.\nepel/7/SRPMS\n\n")) // without gid, uid, mdev // read int32 as seed bseed := rsync.ReadInteger(conn) fmt.Println("SEED", bseed) // send filter_list, empty is 32-bit zero conn.Write([]byte("\x00\x00\x00\x00")) rsync.HandShake(conn) // fmt.Println(readInteger(conn)) fmt.Println("Handshake OK") log.Println("HandShake OK") data := make(chan byte, 1024*1024) go rsync.DeMuxChan(conn, data) Loading @@ -83,14 +45,14 @@ func Client() { filelist := make(rsync.FileList, 0, 3072) // recv_file_list for { if rsync.GetEntry(data, &filelist) == io.EOF { if rsync.GetFileList(data, &filelist) == io.EOF { break } } fmt.Println("Received File List OK, total size is", len(filelist)) log.Println("Received File List OK, total size is", len(filelist)) ioerr := rsync.GetInteger(data) fmt.Println("IOERR", ioerr) log.Println("IOERR", ioerr) // Sort the filelist lexicographically sort.Sort(filelist) Loading rsync/multiplex.go→rsync/demultiplex.go +0 −0 File moved. View file rsync/receiver.go +55 −9 Original line number Diff line number Diff line Loading @@ -10,9 +10,48 @@ import ( // Header: '@RSYNCD: 31.0\n' + ? + '\n' + arguments + '\0' // Header len 8 AUTHREQD: 18 "@RSYNCD: EXIT" 13 RSYNC_MODULE_LIST_QUERY "\n" // See clienserver.c start_inband_exchange func handshake() { func HandShake(conn net.Conn) { // send my version // send("@RSYNCD: 31.0\n"); conn.Write([]byte("@RSYNCD: 27.0\n")) // receive server's protocol version and seed version_str, _ := ReadLine(conn) var remote_protocol, remote_sub int fmt.Sscanf(version_str, "@RSYNCD: %d.%d", remote_protocol, remote_sub) fmt.Println(version_str) // recv(version) // scanf(version, "@RSYNCD: %d.%d", ) // send mod name // send("Foo\n") conn.Write([]byte("epel\n")) // conn.Write([]byte("\n")) for { // Wait for '@RSYNCD: OK': until \n, then add \0 res, _ := ReadLine(conn) fmt.Print(res) if strings.HasPrefix(res, "@RSYNCD: OK") { break } } // send parameters list //conn.Write([]byte("--server\n--sender\n-g\n-l\n-o\n-p\n-D\n-r\n-t\n.\nepel/7/SRPMS\n\n")) conn.Write([]byte("--server\n--sender\n-l\n-p\n-r\n-t\n.\nepel/7/SRPMS\n\n")) // without gid, uid, mdev // read int32 as seed bseed := ReadInteger(conn) fmt.Println("SEED", bseed) // send filter_list, empty is 32-bit zero conn.Write([]byte("\x00\x00\x00\x00")) } type FileInfo struct { Loading Loading @@ -40,7 +79,7 @@ func (I FileList) Swap(i, j int) { } // file list: ends with '\0' func GetEntry(ds chan byte, filelist *FileList) error { func GetFileList(ds chan byte, filelist *FileList) error { flags := <- ds Loading Loading @@ -148,17 +187,24 @@ func Generate(conn net.Conn, filelist *FileList) { } } // identifier binary.Write(conn, binary.LittleEndian, idx) empty := []byte{0,0,0,0} // identifier, block count, block length, checksum length, block remainder, blocks(short+long) conn.Write(empty) binary.Write(conn, binary.LittleEndian, int32(0)) // 32768 binary.Write(conn, binary.LittleEndian, int32(0)) // 2 conn.Write(empty) // block count, block length(default is 32768?), checksum length(default is 2?), block remainder, blocks(short+long) // Just let them be empty(zero) empty := make([]byte, 16) // 4 + 4 + 4 + 4 bytes conn.Write(empty) // ENDIAN? //conn.Write(empty) //binary.Write(conn, binary.LittleEndian, int32(0)) // 32768 //binary.Write(conn, binary.LittleEndian, int32(0)) // 2 //conn.Write(empty) // Empty checksum // Finish binary.Write(conn, binary.LittleEndian, int32(-1)) } Loading Loading
go.sum 0 → 100644 +45 −0 Original line number Diff line number Diff line github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/minio/minio-go v1.0.0 h1:ooSujki+Z1PRGZsYffJw5jnF5eMBvzMVV86TLAlM0UM= github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o= github.com/minio/minio-go/v6 v6.0.56 h1:H4+v6UFV1V7VkEf1HjL15W9OvTL1Gy8EbMmjQZHqEbg= github.com/minio/minio-go/v6 v6.0.56/go.mod h1:KQMM+/44DSlSGSQWSfRrAZ12FVMmpWNuX37i2AX0jfI= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
main.go +6 −44 Original line number Diff line number Diff line Loading @@ -9,12 +9,11 @@ package main import ( "fmt" "io" "log" "net" "rsync2os/rsync" "sort" "strings" ) // type FList struct { Loading @@ -35,47 +34,10 @@ func Client() { defer conn.Close() // send my version // send("@RSYNCD: 31.0\n"); conn.Write([]byte("@RSYNCD: 27.0\n")) // receive server's protocol version and seed version_str, _ := rsync.ReadLine(conn) var remote_protocol, remote_sub int fmt.Sscanf(version_str, "@RSYNCD: %d.%d", remote_protocol, remote_sub) fmt.Println(version_str) // recv(version) // scanf(version, "@RSYNCD: %d.%d", ) // send mod name // send("Foo\n") conn.Write([]byte("epel\n")) // conn.Write([]byte("\n")) for { // Wait for '@RSYNCD: OK': until \n, then add \0 res, _ := rsync.ReadLine(conn) fmt.Print(res) if strings.HasPrefix(res, "@RSYNCD: OK") { break } } // send parameters list //conn.Write([]byte("--server\n--sender\n-g\n-l\n-o\n-p\n-D\n-r\n-t\n.\nepel/7/SRPMS\n\n")) conn.Write([]byte("--server\n--sender\n-l\n-p\n-r\n-t\n.\nepel/7/SRPMS\n\n")) // without gid, uid, mdev // read int32 as seed bseed := rsync.ReadInteger(conn) fmt.Println("SEED", bseed) // send filter_list, empty is 32-bit zero conn.Write([]byte("\x00\x00\x00\x00")) rsync.HandShake(conn) // fmt.Println(readInteger(conn)) fmt.Println("Handshake OK") log.Println("HandShake OK") data := make(chan byte, 1024*1024) go rsync.DeMuxChan(conn, data) Loading @@ -83,14 +45,14 @@ func Client() { filelist := make(rsync.FileList, 0, 3072) // recv_file_list for { if rsync.GetEntry(data, &filelist) == io.EOF { if rsync.GetFileList(data, &filelist) == io.EOF { break } } fmt.Println("Received File List OK, total size is", len(filelist)) log.Println("Received File List OK, total size is", len(filelist)) ioerr := rsync.GetInteger(data) fmt.Println("IOERR", ioerr) log.Println("IOERR", ioerr) // Sort the filelist lexicographically sort.Sort(filelist) Loading
rsync/receiver.go +55 −9 Original line number Diff line number Diff line Loading @@ -10,9 +10,48 @@ import ( // Header: '@RSYNCD: 31.0\n' + ? + '\n' + arguments + '\0' // Header len 8 AUTHREQD: 18 "@RSYNCD: EXIT" 13 RSYNC_MODULE_LIST_QUERY "\n" // See clienserver.c start_inband_exchange func handshake() { func HandShake(conn net.Conn) { // send my version // send("@RSYNCD: 31.0\n"); conn.Write([]byte("@RSYNCD: 27.0\n")) // receive server's protocol version and seed version_str, _ := ReadLine(conn) var remote_protocol, remote_sub int fmt.Sscanf(version_str, "@RSYNCD: %d.%d", remote_protocol, remote_sub) fmt.Println(version_str) // recv(version) // scanf(version, "@RSYNCD: %d.%d", ) // send mod name // send("Foo\n") conn.Write([]byte("epel\n")) // conn.Write([]byte("\n")) for { // Wait for '@RSYNCD: OK': until \n, then add \0 res, _ := ReadLine(conn) fmt.Print(res) if strings.HasPrefix(res, "@RSYNCD: OK") { break } } // send parameters list //conn.Write([]byte("--server\n--sender\n-g\n-l\n-o\n-p\n-D\n-r\n-t\n.\nepel/7/SRPMS\n\n")) conn.Write([]byte("--server\n--sender\n-l\n-p\n-r\n-t\n.\nepel/7/SRPMS\n\n")) // without gid, uid, mdev // read int32 as seed bseed := ReadInteger(conn) fmt.Println("SEED", bseed) // send filter_list, empty is 32-bit zero conn.Write([]byte("\x00\x00\x00\x00")) } type FileInfo struct { Loading Loading @@ -40,7 +79,7 @@ func (I FileList) Swap(i, j int) { } // file list: ends with '\0' func GetEntry(ds chan byte, filelist *FileList) error { func GetFileList(ds chan byte, filelist *FileList) error { flags := <- ds Loading Loading @@ -148,17 +187,24 @@ func Generate(conn net.Conn, filelist *FileList) { } } // identifier binary.Write(conn, binary.LittleEndian, idx) empty := []byte{0,0,0,0} // identifier, block count, block length, checksum length, block remainder, blocks(short+long) conn.Write(empty) binary.Write(conn, binary.LittleEndian, int32(0)) // 32768 binary.Write(conn, binary.LittleEndian, int32(0)) // 2 conn.Write(empty) // block count, block length(default is 32768?), checksum length(default is 2?), block remainder, blocks(short+long) // Just let them be empty(zero) empty := make([]byte, 16) // 4 + 4 + 4 + 4 bytes conn.Write(empty) // ENDIAN? //conn.Write(empty) //binary.Write(conn, binary.LittleEndian, int32(0)) // 32768 //binary.Write(conn, binary.LittleEndian, int32(0)) // 2 //conn.Write(empty) // Empty checksum // Finish binary.Write(conn, binary.LittleEndian, int32(-1)) } Loading