17db96d56Sopenharmony_ci#! /usr/bin/env python3
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci"""Python utility to print MD5 checksums of argument files.
47db96d56Sopenharmony_ci"""
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_cibufsize = 8096
87db96d56Sopenharmony_cifnfilter = None
97db96d56Sopenharmony_cirmode = 'rb'
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciusage = """
127db96d56Sopenharmony_ciusage: md5sum.py [-b] [-t] [-l] [-s bufsize] [file ...]
137db96d56Sopenharmony_ci-b        : read files in binary mode (default)
147db96d56Sopenharmony_ci-t        : read files in text mode (you almost certainly don't want this!)
157db96d56Sopenharmony_ci-l        : print last pathname component only
167db96d56Sopenharmony_ci-s bufsize: read buffer size (default %d)
177db96d56Sopenharmony_cifile ...  : files to sum; '-' or no files means stdin
187db96d56Sopenharmony_ci""" % bufsize
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ciimport io
217db96d56Sopenharmony_ciimport sys
227db96d56Sopenharmony_ciimport os
237db96d56Sopenharmony_ciimport getopt
247db96d56Sopenharmony_cifrom hashlib import md5
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_cidef sum(*files):
277db96d56Sopenharmony_ci    sts = 0
287db96d56Sopenharmony_ci    if files and isinstance(files[-1], io.IOBase):
297db96d56Sopenharmony_ci        out, files = files[-1], files[:-1]
307db96d56Sopenharmony_ci    else:
317db96d56Sopenharmony_ci        out = sys.stdout
327db96d56Sopenharmony_ci    if len(files) == 1 and not isinstance(files[0], str):
337db96d56Sopenharmony_ci        files = files[0]
347db96d56Sopenharmony_ci    for f in files:
357db96d56Sopenharmony_ci        if isinstance(f, str):
367db96d56Sopenharmony_ci            if f == '-':
377db96d56Sopenharmony_ci                sts = printsumfp(sys.stdin, '<stdin>', out) or sts
387db96d56Sopenharmony_ci            else:
397db96d56Sopenharmony_ci                sts = printsum(f, out) or sts
407db96d56Sopenharmony_ci        else:
417db96d56Sopenharmony_ci            sts = sum(f, out) or sts
427db96d56Sopenharmony_ci    return sts
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_cidef printsum(filename, out=sys.stdout):
457db96d56Sopenharmony_ci    try:
467db96d56Sopenharmony_ci        fp = open(filename, rmode)
477db96d56Sopenharmony_ci    except IOError as msg:
487db96d56Sopenharmony_ci        sys.stderr.write('%s: Can\'t open: %s\n' % (filename, msg))
497db96d56Sopenharmony_ci        return 1
507db96d56Sopenharmony_ci    with fp:
517db96d56Sopenharmony_ci        if fnfilter:
527db96d56Sopenharmony_ci            filename = fnfilter(filename)
537db96d56Sopenharmony_ci        sts = printsumfp(fp, filename, out)
547db96d56Sopenharmony_ci    return sts
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_cidef printsumfp(fp, filename, out=sys.stdout):
577db96d56Sopenharmony_ci    m = md5()
587db96d56Sopenharmony_ci    try:
597db96d56Sopenharmony_ci        while 1:
607db96d56Sopenharmony_ci            data = fp.read(bufsize)
617db96d56Sopenharmony_ci            if not data:
627db96d56Sopenharmony_ci                break
637db96d56Sopenharmony_ci            if isinstance(data, str):
647db96d56Sopenharmony_ci                data = data.encode(fp.encoding)
657db96d56Sopenharmony_ci            m.update(data)
667db96d56Sopenharmony_ci    except IOError as msg:
677db96d56Sopenharmony_ci        sys.stderr.write('%s: I/O error: %s\n' % (filename, msg))
687db96d56Sopenharmony_ci        return 1
697db96d56Sopenharmony_ci    out.write('%s %s\n' % (m.hexdigest(), filename))
707db96d56Sopenharmony_ci    return 0
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_cidef main(args = sys.argv[1:], out=sys.stdout):
737db96d56Sopenharmony_ci    global fnfilter, rmode, bufsize
747db96d56Sopenharmony_ci    try:
757db96d56Sopenharmony_ci        opts, args = getopt.getopt(args, 'blts:')
767db96d56Sopenharmony_ci    except getopt.error as msg:
777db96d56Sopenharmony_ci        sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage))
787db96d56Sopenharmony_ci        return 2
797db96d56Sopenharmony_ci    for o, a in opts:
807db96d56Sopenharmony_ci        if o == '-l':
817db96d56Sopenharmony_ci            fnfilter = os.path.basename
827db96d56Sopenharmony_ci        elif o == '-b':
837db96d56Sopenharmony_ci            rmode = 'rb'
847db96d56Sopenharmony_ci        elif o == '-t':
857db96d56Sopenharmony_ci            rmode = 'r'
867db96d56Sopenharmony_ci        elif o == '-s':
877db96d56Sopenharmony_ci            bufsize = int(a)
887db96d56Sopenharmony_ci    if not args:
897db96d56Sopenharmony_ci        args = ['-']
907db96d56Sopenharmony_ci    return sum(args, out)
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ciif __name__ == '__main__' or __name__ == sys.argv[0]:
937db96d56Sopenharmony_ci    sys.exit(main(sys.argv[1:], sys.stdout))
94