genfiles.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
  2. // All rights reserved. Use of this source code is governed by an MIT-style
  3. // license that can be found in the LICENSE file.
  4. // +build ignore
  5. package main
  6. import (
  7. "crypto/rand"
  8. "flag"
  9. "fmt"
  10. "io"
  11. "log"
  12. mr "math/rand"
  13. "os"
  14. "path/filepath"
  15. "time"
  16. )
  17. func name() string {
  18. var b [16]byte
  19. rand.Reader.Read(b[:])
  20. return fmt.Sprintf("%x", b[:])
  21. }
  22. func main() {
  23. var files int
  24. var maxexp int
  25. var srcname string
  26. flag.IntVar(&files, "files", 1000, "Number of files")
  27. flag.IntVar(&maxexp, "maxexp", 20, "Maximum file size (max = 2^n + 128*1024 B)")
  28. flag.StringVar(&srcname, "src", "/usr/share/dict/words", "Source material")
  29. flag.Parse()
  30. fd, err := os.Open(srcname)
  31. if err != nil {
  32. log.Fatal(err)
  33. }
  34. for i := 0; i < files; i++ {
  35. n := name()
  36. p0 := filepath.Join(string(n[0]), n[0:2])
  37. err = os.MkdirAll(p0, 0755)
  38. if err != nil {
  39. log.Fatal(err)
  40. }
  41. s := 1 << uint(mr.Intn(maxexp))
  42. a := 128 * 1024
  43. if a > s {
  44. a = s
  45. }
  46. s += mr.Intn(a)
  47. src := io.LimitReader(&inifiteReader{fd}, int64(s))
  48. p1 := filepath.Join(p0, n)
  49. dst, err := os.Create(p1)
  50. if err != nil {
  51. log.Fatal(err)
  52. }
  53. _, err = io.Copy(dst, src)
  54. if err != nil {
  55. log.Fatal(err)
  56. }
  57. err = dst.Close()
  58. if err != nil {
  59. log.Fatal(err)
  60. }
  61. err = os.Chmod(p1, os.FileMode(mr.Intn(0777)|0400))
  62. if err != nil {
  63. log.Fatal(err)
  64. }
  65. t := time.Now().Add(-time.Duration(mr.Intn(30*86400)) * time.Second)
  66. err = os.Chtimes(p1, t, t)
  67. if err != nil {
  68. log.Fatal(err)
  69. }
  70. }
  71. }
  72. type inifiteReader struct {
  73. rd io.ReadSeeker
  74. }
  75. func (i *inifiteReader) Read(bs []byte) (int, error) {
  76. n, err := i.rd.Read(bs)
  77. if err == io.EOF {
  78. err = nil
  79. i.rd.Seek(0, 0)
  80. }
  81. return n, err
  82. }