|
2651
|
1 #! /usr/local/bin/python
|
|
|
2
|
|
|
3 # 3) System Test
|
|
|
4 #
|
|
|
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():
|
|
|
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('')
|
|
|
40
|
|
|
41 def reportboguslinks(prefix):
|
|
|
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('..')
|
|
|
73
|
|
|
74 main()
|