Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "os"
  6. "strconv"
  7. "syscall"
  8. "time"
  9.  
  10. "github.com/dustin/go-humanize"
  11. )
  12.  
  13. var numread, numout, outSize uint64
  14.  
  15. func main() {
  16. var err error
  17.  
  18. if len(os.Args) < 4 {
  19. fmt.Println("Parameters: stripesize output file1...")
  20. os.Exit(0)
  21. }
  22. stripeSizeStr := os.Args[1]
  23. outSizeStr := os.Args[2]
  24. outfile := os.Args[3]
  25. s := len(os.Args) - 4
  26. stripeSize, err := strconv.Atoi(stripeSizeStr)
  27. if err != nil {
  28. panic(err)
  29. }
  30.  
  31. outSize, err = strconv.ParseUint(outSizeStr, 10, 64)
  32. if err != nil {
  33. panic(err)
  34. }
  35.  
  36. fdOut, err := syscall.Open(outfile, syscall.O_CREAT|syscall.O_EXCL|syscall.O_RDWR, 0600)
  37.  
  38. if err != nil {
  39. panic(err)
  40. return
  41. }
  42.  
  43. defer syscall.Close(fdOut)
  44.  
  45. fd := make([]int, s, s)
  46. for i := 0; i < s; i++ {
  47. fd[i], err = syscall.Open(os.Args[i+4], syscall.O_RDONLY, 0777)
  48.  
  49. if err != nil {
  50. fmt.Print(err.Error(), "\n")
  51. return
  52. }
  53.  
  54. defer syscall.Close(fd[i])
  55. }
  56.  
  57. var bytesread, bytesout int
  58. buffer := make([]byte, stripeSize)
  59. loop := true
  60.  
  61. go func() {
  62. for {
  63. showProgress()
  64. time.Sleep(5 * time.Second)
  65. }
  66. }()
  67.  
  68. for {
  69. for _, file := range fd {
  70. bytesread, err = syscall.Read(file, buffer)
  71.  
  72. if err != nil {
  73. panic(err)
  74. }
  75.  
  76. if bytesread < stripeSize {
  77. loop = false
  78. break
  79. }
  80. numread += uint64(bytesread)
  81.  
  82. bytesout, err = syscall.Write(fdOut, buffer)
  83. if err != nil {
  84. panic(err)
  85. }
  86. numout += uint64(bytesout)
  87. }
  88. if numout > outSize {
  89. loop = false
  90. }
  91.  
  92. if !loop {
  93. break
  94. }
  95. }
  96.  
  97. showProgress()
  98. }
  99.  
  100. func showProgress() {
  101. fmt.Printf("Read: %s; written: %s/%s\n", humanize.Bytes(numread), humanize.Bytes(numout), humanize.Bytes(outSize))
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement