From: Rusty Russell Date: Thu, 13 Nov 2008 11:28:50 +0000 (+1030) Subject: Our first junkcode! X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=161ae5c7585f5223a770fca66e290a4093501907 Our first junkcode! --- diff --git a/junkcode/codedr@gmail.com-grok/grok.c b/junkcode/codedr@gmail.com-grok/grok.c new file mode 100644 index 00000000..8ae00e65 --- /dev/null +++ b/junkcode/codedr@gmail.com-grok/grok.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +/** + ** grok -- program to a alter bytes at an offset + ** + ** Sometimes it useful to alter bytes in a binary file. + ** To those who would 'just use emacs', the binary is not always a file on disk. + ** + ** codedr@gmail.com + ** + ** Licence: Public Domain + */ + +int +main(int argc, char **argv) +{ + int i, dc = 0, fd; + int sz, cnt, offset; + char *fn; + unsigned char *buf, *data; + /* grok fn offset data */ + + if (3 > argc) { + fputs("usage: grok fn offset [cdata]+\n", stderr); + exit(1); + } + fn = argv[1]; + offset = strtol(argv[2], NULL, 16); + data = (unsigned char *) calloc(argc - 2, sizeof(unsigned char)); + for (i = 3; i < argc; i++) { + long x; + x = strtol(argv[i], NULL, 16); + data[dc++] = 0xff & x; + } + + if (0 > (fd = open(fn, O_RDWR))) { + fprintf(stderr, "cannot open %s, errno %d\n", fn, errno); + exit(2); + } + + if (0 > lseek(fd, offset, SEEK_SET)) { + fprintf(stderr, "cannot seek to %x, errno %d\n", offset, errno); + exit(2); + } + + buf = (unsigned char *) calloc(dc, sizeof(unsigned char)); + + if (0 > (cnt = read(fd, buf, dc))) { + fprintf(stderr, "cannot read %d bytes at %x, errno %d\n", + dc, offset, errno); + exit(3); + } + printf("read %d of %d bytes\n", cnt, dc); + /* dumpBuf(buf, cnt); */ + + if (0 > lseek(fd, offset, SEEK_SET)) { + fprintf(stderr, "cannot seek to %x, errno %d\n", offset, errno); + exit(2); + } + + if (0 > (sz = write(fd, data, cnt))) { + fprintf(stderr, "cannot write %d bytes at %x, errno %d\n", + cnt, offset, errno); + exit(4); + } + printf("wrote %d of %d bytes\n", sz, cnt); + exit(0); +}