| 
									
										
										
										
											2010-03-11 22:53:45 +00:00
										 |  |  | #! /usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											1995-04-10 11:40:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # 3)  System Test | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											1995-04-10 11:40:26 +00:00
										 |  |  | #     Given a list of directories, report any bogus symbolic links contained | 
					
						
							|  |  |  | #     anywhere in those subtrees.  A bogus symbolic link is one that cannot | 
					
						
							|  |  |  | #     be resolved because it points to a nonexistent or otherwise | 
					
						
							|  |  |  | #     unresolvable file.  Do *not* use an external find executable. | 
					
						
							|  |  |  | #     Directories may be very very deep.  Print a warning immediately if the | 
					
						
							|  |  |  | #     system you're running on doesn't support symbolic links. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # This implementation: | 
					
						
							|  |  |  | # - takes one optional argument, using the current directory as default | 
					
						
							|  |  |  | # - uses chdir to increase performance | 
					
						
							|  |  |  | # - sorts the names per directory | 
					
						
							|  |  |  | # - prints output lines of the form "path1 -> path2" as it goes | 
					
						
							|  |  |  | # - prints error messages about directories it can't list or chdir into | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | from stat import * | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         # Note: can't test for presence of lstat -- it's always there | 
					
						
							|  |  |  |         dummy = os.readlink | 
					
						
							|  |  |  |     except AttributeError: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print("This system doesn't have symbolic links") | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |         sys.exit(0) | 
					
						
							|  |  |  |     if sys.argv[1:]: | 
					
						
							|  |  |  |         prefix = sys.argv[1] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         prefix = '' | 
					
						
							|  |  |  |     if prefix: | 
					
						
							|  |  |  |         os.chdir(prefix) | 
					
						
							|  |  |  |         if prefix[-1:] != '/': prefix = prefix + '/' | 
					
						
							|  |  |  |         reportboguslinks(prefix) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         reportboguslinks('') | 
					
						
							| 
									
										
										
										
											1995-04-10 11:40:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def reportboguslinks(prefix): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         names = os.listdir('.') | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |     except os.error as msg: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print("%s%s: can't list: %s" % (prefix, '.', msg)) | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |     names.sort() | 
					
						
							|  |  |  |     for name in names: | 
					
						
							|  |  |  |         if name == os.curdir or name == os.pardir: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             mode = os.lstat(name)[ST_MODE] | 
					
						
							|  |  |  |         except os.error: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |             print("%s%s: can't stat: %s" % (prefix, name, msg)) | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |             continue | 
					
						
							|  |  |  |         if S_ISLNK(mode): | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 os.stat(name) | 
					
						
							|  |  |  |             except os.error: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |                 print("%s%s -> %s" % \ | 
					
						
							|  |  |  |                       (prefix, name, os.readlink(name))) | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |         elif S_ISDIR(mode): | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 os.chdir(name) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |             except os.error as msg: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |                 print("%s%s: can't chdir: %s" % \ | 
					
						
							|  |  |  |                       (prefix, name, msg)) | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |                 continue | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 reportboguslinks(prefix + name + '/') | 
					
						
							|  |  |  |             finally: | 
					
						
							|  |  |  |                 os.chdir('..') | 
					
						
							| 
									
										
										
										
											1995-04-10 11:40:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | main() |