hexdumper non blocking io
This commit is contained in:
parent
61dbf7a500
commit
bf9a01d7ba
|
@ -7,7 +7,9 @@ This is a list of tasks that would be cool to add.
|
||||||
- (x) Dump basic files with format
|
- (x) Dump basic files with format
|
||||||
- (x) Dump basic files with chars
|
- (x) Dump basic files with chars
|
||||||
- (x) Be able to dump larger files or put out an error
|
- (x) Be able to dump larger files or put out an error
|
||||||
- ( ) Stop reading when read gets blocked /somehow/
|
- (x) Stop reading when read gets blocked /somehow/
|
||||||
|
Simple syscall
|
||||||
|
- ( ) Wait for new input when the file is lazy
|
||||||
- ( ) Install script to system
|
- ( ) Install script to system
|
||||||
*** Networking
|
*** Networking
|
||||||
- ( ) Mini curl
|
- ( ) Mini curl
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import fcntl # only for non blocking IO, if you dont know what it is, you can ignore it or study up
|
||||||
|
|
||||||
# 2**30 bytes aka 1 Mebibyte
|
# 2**30 bytes aka 1 Mebibyte
|
||||||
MAX_SIZE: int = 0x100000
|
MAX_SIZE: int = 0x100000
|
||||||
|
@ -40,7 +41,35 @@ def main():
|
||||||
|
|
||||||
# open file
|
# open file
|
||||||
try:
|
try:
|
||||||
file = open(args.file, "rb")
|
# Tl;Dr, use this unless you want to do some lower level stuff
|
||||||
|
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||||
|
#file = open(args.file, "rb")
|
||||||
|
|
||||||
|
|
||||||
|
# the above is sufficient for most regular uses
|
||||||
|
#
|
||||||
|
# some "files" are "lazy" and block the reading process until they have
|
||||||
|
# content, like network connections, fifos, sockets, and so on.
|
||||||
|
|
||||||
|
# the following is a lower level approach to handling these. We
|
||||||
|
# basically call a part of the libc, telling it to open the file
|
||||||
|
# nonblocking. If something blocks, it will simply refuse.
|
||||||
|
#
|
||||||
|
# as far as i know, this only works on UNIX (like) systems. Windows
|
||||||
|
# is the only major exception.
|
||||||
|
|
||||||
|
# make a syscall that will open our file in readonly mode, nonblocking.
|
||||||
|
# if it did not exist and we write to it, it would be created with the
|
||||||
|
# perms: 644 (like `chmod 644 myfile`)
|
||||||
|
fd = os.open(args.file, os.O_RDONLY | os.O_NONBLOCK, mode=0o644)
|
||||||
|
# now we make the fd into the high level python class `file`
|
||||||
|
file = os.fdopen(fd, "rb")
|
||||||
|
# i read somewhere that file.readline() does not work like this, but as
|
||||||
|
# we are reading binary data anyways, I don't care.
|
||||||
|
# check if the file is readable
|
||||||
|
if not file.peek(1):
|
||||||
|
print("File is blocked, trying to wait...")
|
||||||
|
file = open(args.file, "rb")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Could not open file '{args.file}': {e}")
|
print(f"Could not open file '{args.file}': {e}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
@ -99,6 +128,7 @@ def main():
|
||||||
print(line)
|
print(line)
|
||||||
index += 16
|
index += 16
|
||||||
|
|
||||||
|
file.close()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in New Issue