Guido van Rossum | f06ee5f | 1996-11-27 19:52:01 +0000 | [diff] [blame] | 1 | #! /usr/bin/env python |
Guido van Rossum | 21bc15b | 1995-04-10 11:40:26 +0000 | [diff] [blame] | 2 | |
| 3 | # 3) System Test |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 4 | # |
Guido van Rossum | 21bc15b | 1995-04-10 11:40:26 +0000 | [diff] [blame] | 5 | # Given a list of directories, report any bogus symbolic links contained |
| 6 | # anywhere in those subtrees. A bogus symbolic link is one that cannot |
| 7 | # be resolved because it points to a nonexistent or otherwise |
| 8 | # unresolvable file. Do *not* use an external find executable. |
| 9 | # Directories may be very very deep. Print a warning immediately if the |
| 10 | # system you're running on doesn't support symbolic links. |
| 11 | |
| 12 | # This implementation: |
| 13 | # - takes one optional argument, using the current directory as default |
| 14 | # - uses chdir to increase performance |
| 15 | # - sorts the names per directory |
| 16 | # - prints output lines of the form "path1 -> path2" as it goes |
| 17 | # - prints error messages about directories it can't list or chdir into |
| 18 | |
| 19 | import os |
| 20 | import sys |
| 21 | from stat import * |
| 22 | |
| 23 | def main(): |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 24 | try: |
| 25 | # Note: can't test for presence of lstat -- it's always there |
| 26 | dummy = os.readlink |
| 27 | except AttributeError: |
| 28 | print "This system doesn't have symbolic links" |
| 29 | sys.exit(0) |
| 30 | if sys.argv[1:]: |
| 31 | prefix = sys.argv[1] |
| 32 | else: |
| 33 | prefix = '' |
| 34 | if prefix: |
| 35 | os.chdir(prefix) |
| 36 | if prefix[-1:] != '/': prefix = prefix + '/' |
| 37 | reportboguslinks(prefix) |
| 38 | else: |
| 39 | reportboguslinks('') |
Guido van Rossum | 21bc15b | 1995-04-10 11:40:26 +0000 | [diff] [blame] | 40 | |
| 41 | def reportboguslinks(prefix): |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 42 | try: |
| 43 | names = os.listdir('.') |
| 44 | except os.error, msg: |
| 45 | print "%s%s: can't list: %s" % (prefix, '.', msg) |
| 46 | return |
| 47 | names.sort() |
| 48 | for name in names: |
| 49 | if name == os.curdir or name == os.pardir: |
| 50 | continue |
| 51 | try: |
| 52 | mode = os.lstat(name)[ST_MODE] |
| 53 | except os.error: |
| 54 | print "%s%s: can't stat: %s" % (prefix, name, msg) |
| 55 | continue |
| 56 | if S_ISLNK(mode): |
| 57 | try: |
| 58 | os.stat(name) |
| 59 | except os.error: |
| 60 | print "%s%s -> %s" % \ |
| 61 | (prefix, name, os.readlink(name)) |
| 62 | elif S_ISDIR(mode): |
| 63 | try: |
| 64 | os.chdir(name) |
| 65 | except os.error, msg: |
| 66 | print "%s%s: can't chdir: %s" % \ |
| 67 | (prefix, name, msg) |
| 68 | continue |
| 69 | try: |
| 70 | reportboguslinks(prefix + name + '/') |
| 71 | finally: |
| 72 | os.chdir('..') |
Guido van Rossum | 21bc15b | 1995-04-10 11:40:26 +0000 | [diff] [blame] | 73 | |
| 74 | main() |