17db96d56Sopenharmony_ci#! /usr/bin/env python3
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci# Variant of "which".
47db96d56Sopenharmony_ci# On stderr, near and total misses are reported.
57db96d56Sopenharmony_ci# '-l<flags>' argument adds ls -l<flags> of each file found.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ciimport sys
87db96d56Sopenharmony_ciif sys.path[0] in (".", ""): del sys.path[0]
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciimport sys, os
117db96d56Sopenharmony_cifrom stat import *
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_cidef msg(str):
147db96d56Sopenharmony_ci    sys.stderr.write(str + '\n')
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_cidef main():
177db96d56Sopenharmony_ci    pathlist = os.environ['PATH'].split(os.pathsep)
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci    sts = 0
207db96d56Sopenharmony_ci    longlist = ''
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci    if sys.argv[1:] and sys.argv[1][:2] == '-l':
237db96d56Sopenharmony_ci        longlist = sys.argv[1]
247db96d56Sopenharmony_ci        del sys.argv[1]
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    for prog in sys.argv[1:]:
277db96d56Sopenharmony_ci        ident = ()
287db96d56Sopenharmony_ci        for dir in pathlist:
297db96d56Sopenharmony_ci            filename = os.path.join(dir, prog)
307db96d56Sopenharmony_ci            try:
317db96d56Sopenharmony_ci                st = os.stat(filename)
327db96d56Sopenharmony_ci            except OSError:
337db96d56Sopenharmony_ci                continue
347db96d56Sopenharmony_ci            if not S_ISREG(st[ST_MODE]):
357db96d56Sopenharmony_ci                msg(filename + ': not a disk file')
367db96d56Sopenharmony_ci            else:
377db96d56Sopenharmony_ci                mode = S_IMODE(st[ST_MODE])
387db96d56Sopenharmony_ci                if mode & 0o111:
397db96d56Sopenharmony_ci                    if not ident:
407db96d56Sopenharmony_ci                        print(filename)
417db96d56Sopenharmony_ci                        ident = st[:3]
427db96d56Sopenharmony_ci                    else:
437db96d56Sopenharmony_ci                        if st[:3] == ident:
447db96d56Sopenharmony_ci                            s = 'same as: '
457db96d56Sopenharmony_ci                        else:
467db96d56Sopenharmony_ci                            s = 'also: '
477db96d56Sopenharmony_ci                        msg(s + filename)
487db96d56Sopenharmony_ci                else:
497db96d56Sopenharmony_ci                    msg(filename + ': not executable')
507db96d56Sopenharmony_ci            if longlist:
517db96d56Sopenharmony_ci                sts = os.system('ls ' + longlist + ' ' + filename)
527db96d56Sopenharmony_ci                sts = os.waitstatus_to_exitcode(sts)
537db96d56Sopenharmony_ci                if sts: msg('"ls -l" exit status: ' + repr(sts))
547db96d56Sopenharmony_ci        if not ident:
557db96d56Sopenharmony_ci            msg(prog + ': not found')
567db96d56Sopenharmony_ci            sts = 1
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    sys.exit(sts)
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ciif __name__ == '__main__':
617db96d56Sopenharmony_ci    main()
62