blob: 4250ddee03db811c603bc90f08d648262d14c29c [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossum07c96451994-10-03 16:45:35 +00002
3# print md5 checksum for files
4
5bufsize = 8096
6fnfilter = None
7rmode = 'r'
8
9usage = """
10usage: sum5 [-b] [-t] [-l] [-s bufsize] [file ...]
11-b : read files in binary mode
12-t : read files in text mode (default)
13-l : print last pathname component only
14-s bufsize: read buffer size (default %d)
15file ... : files to sum; '-' or no files means stdin
16""" % bufsize
17
18import sys
Guido van Rossum07c96451994-10-03 16:45:35 +000019import os
20import md5
21import regsub
22
23StringType = type('')
24FileType = type(sys.stdin)
25
26def sum(*files):
Tim Peters70c43782001-01-17 08:48:39 +000027 sts = 0
28 if files and type(files[-1]) == FileType:
29 out, files = files[-1], files[:-1]
30 else:
31 out = sys.stdout
32 if len(files) == 1 and type(files[0]) != StringType:
33 files = files[0]
34 for f in files:
35 if type(f) == StringType:
36 if f == '-':
37 sts = printsumfp(sys.stdin, '<stdin>', out) or sts
38 else:
39 sts = printsum(f, out) or sts
40 else:
41 sts = sum(f, out) or sts
42 return sts
Guido van Rossum07c96451994-10-03 16:45:35 +000043
44def printsum(file, out = sys.stdout):
Tim Peters70c43782001-01-17 08:48:39 +000045 try:
46 fp = open(file, rmode)
47 except IOError, msg:
48 sys.stderr.write('%s: Can\'t open: %s\n' % (file, msg))
49 return 1
50 if fnfilter:
51 file = fnfilter(file)
52 sts = printsumfp(fp, file, out)
53 fp.close()
54 return sts
Guido van Rossum07c96451994-10-03 16:45:35 +000055
56def printsumfp(fp, file, out = sys.stdout):
Andrew M. Kuchlinga90a3b42002-04-17 21:53:21 +000057 m = md5.new()
Tim Peters70c43782001-01-17 08:48:39 +000058 try:
59 while 1:
60 data = fp.read(bufsize)
61 if not data: break
62 m.update(data)
63 except IOError, msg:
64 sys.stderr.write('%s: I/O error: %s\n' % (file, msg))
65 return 1
66 out.write('%s %s\n' % (hexify(m.digest()), file))
67 return 0
Guido van Rossum07c96451994-10-03 16:45:35 +000068
69def hexify(s):
Tim Peters70c43782001-01-17 08:48:39 +000070 res = ''
71 for c in s:
72 res = res + '%02x' % ord(c)
73 return res
Guido van Rossum07c96451994-10-03 16:45:35 +000074
75def main(args = sys.argv[1:], out = sys.stdout):
Tim Peters70c43782001-01-17 08:48:39 +000076 global fnfilter, rmode, bufsize
77 import getopt
78 try:
79 opts, args = getopt.getopt(args, 'blts:')
80 except getopt.error, msg:
81 sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage))
82 return 2
83 for o, a in opts:
84 if o == '-l':
85 fnfilter = os.path.basename
86 if o == '-b':
87 rmode = 'rb'
88 if o == '-t':
89 rmode = 'r'
90 if o == '-s':
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000091 bufsize = int(a)
Tim Peters70c43782001-01-17 08:48:39 +000092 if not args: args = ['-']
93 return sum(args, out)
Guido van Rossum07c96451994-10-03 16:45:35 +000094
95if __name__ == '__main__' or __name__ == sys.argv[0]:
Tim Peters70c43782001-01-17 08:48:39 +000096 sys.exit(main(sys.argv[1:], sys.stdout))