From 3dc597cb5f89e367d41f10e4b6cac5d4f7cecd11 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Mon, 10 Jun 2024 04:11:26 -0500 Subject: [PATCH] Added dbgerr.py for debugging littlefs's error codes This is based on moreutils's errno program, but specialized for littlefs's error codes. Everything is hardcoded in dbgerr.py, so this should be portable to any OS really. Hopefully this will be useful for debugging littlefs errors: $ ./scripts/dbgerr.py -84 LFS_ERR_CORRUPT -84 Corrupted --- scripts/dbgerr.py | 96 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 scripts/dbgerr.py diff --git a/scripts/dbgerr.py b/scripts/dbgerr.py new file mode 100755 index 00000000..fc4c0418 --- /dev/null +++ b/scripts/dbgerr.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 + + +ERRS = [ + ('OK', 0, "No error" ), + ('UNKNOWN', -1, "Unknown error" ), + ('INVAL', -22, "Invalid parameter" ), + ('NOTSUP', -95, "Operation not supported" ), + ('IO', -5, "Error during device operation" ), + ('CORRUPT', -84, "Corrupted" ), + ('NOENT', -2, "No directory entry" ), + ('EXIST', -17, "Entry already exists" ), + ('NOTDIR', -20, "Entry is not a dir" ), + ('ISDIR', -21, "Entry is a dir" ), + ('NOTEMPTY', -39, "Dir is not empty" ), + ('FBIG', -27, "File too large" ), + ('NOSPC', -28, "No space left on device" ), + ('NOMEM', -12, "No more memory available" ), + ('NOATTR', -61, "No data/attr available" ), + ('NAMETOOLONG', -36, "File name too long" ), + ('RANGE', -34, "Result out of range" ), +] + + +def main(errs, *, + list=False): + list_, list = list, __builtins__.list + + # list all known error codes + if list_: + # first find the widths + w = [0, 0] + for n, e, h in ERRS: + w[0] = max(w[0], len('LFS_ERR_')+len(n)) + w[1] = max(w[1], len(str(e))) + + # print + for n, e, h in ERRS: + print('%-*s %-*s %s' % ( + w[0], 'LFS_ERR_'+n, + w[1], e, + h)) + + # find these errors + else: + def find_err(err): + # find by LFS_ERR_+name + for n, e, h in ERRS: + if 'LFS_ERR_'+n == err: + return n, e, h + # find by name + for n, e, h in ERRS: + if n == err: + return n, e, h + # find by E+name + for n, e, h in ERRS: + if 'E'+n == err: + return n, e, h + try: + # find by err code + for n, e, h in ERRS: + if e == int(err, 0): + return n, e, h + # find by negated err code + for n, e, h in ERRS: + if e == -int(err, 0): + return n, e, h + except ValueError: + pass + # not found + raise KeyError(err) + + for err in errs: + try: + n, e, h = find_err(err) + print('%s %s %s' % ('LFS_ERR_'+n, e, h)) + except KeyError: + print('%s ?' % err) + +if __name__ == "__main__": + import argparse + import sys + parser = argparse.ArgumentParser( + description="Decode littlefs error codes.", + allow_abbrev=False) + parser.add_argument( + 'errs', + nargs='*', + help="Error codes or error names to decode.") + parser.add_argument( + '-l', '--list', + action='store_true', + help="List all known error codes.") + sys.exit(main(**{k: v + for k, v in vars(parser.parse_intermixed_args()).items() + if v is not None}))