You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.6 KiB

36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
  1. #! /usr/bin/env python3
  2. # mkreal
  3. #
  4. # turn a symlink to a directory into a real directory
  5. import sys
  6. import os
  7. from stat import *
  8. join = os.path.join
  9. error = 'mkreal error'
  10. BUFSIZE = 32*1024
  11. def mkrealfile(name):
  12. st = os.stat(name) # Get the mode
  13. mode = S_IMODE(st[ST_MODE])
  14. linkto = os.readlink(name) # Make sure again it's a symlink
  15. f_in = open(name, 'r') # This ensures it's a file
  16. os.unlink(name)
  17. f_out = open(name, 'w')
  18. while 1:
  19. buf = f_in.read(BUFSIZE)
  20. if not buf: break
  21. f_out.write(buf)
  22. del f_out # Flush data to disk before changing mode
  23. os.chmod(name, mode)
  24. def mkrealdir(name):
  25. st = os.stat(name) # Get the mode
  26. mode = S_IMODE(st[ST_MODE])
  27. linkto = os.readlink(name)
  28. files = os.listdir(name)
  29. os.unlink(name)
  30. os.mkdir(name, mode)
  31. os.chmod(name, mode)
  32. linkto = join(os.pardir, linkto)
  33. #
  34. for filename in files:
  35. if filename not in (os.curdir, os.pardir):
  36. os.symlink(join(linkto, filename), join(name, filename))
  37. def main():
  38. sys.stdout = sys.stderr
  39. progname = os.path.basename(sys.argv[0])
  40. if progname == '-c': progname = 'mkreal'
  41. args = sys.argv[1:]
  42. if not args:
  43. print('usage:', progname, 'path ...')
  44. sys.exit(2)
  45. status = 0
  46. for name in args:
  47. if not os.path.islink(name):
  48. print(progname+':', name+':', 'not a symlink')
  49. status = 1
  50. else:
  51. if os.path.isdir(name):
  52. mkrealdir(name)
  53. else:
  54. mkrealfile(name)
  55. sys.exit(status)
  56. if __name__ == '__main__':
  57. main()