xkeylog

Sudoless X11 keylogger
git clone https://git.sinitax.com/sinitax/xkeylog
Log | Files | Refs | sfeed.txt

commit 400bf83b1f67e24e9615699c48d6a469baf0db8e
parent 9514cb8f2bb57de34c8e5a63bda8da79e92aae64
Author: Louis Burda <quent.burda@gmail.com>
Date:   Thu, 22 Jun 2023 22:44:34 +0200

Add MIT license

Diffstat:
Mxkeylog.c | 46+++++++++++++++++++++++++++++++---------------
1 file changed, 31 insertions(+), 15 deletions(-)

diff --git a/xkeylog.c b/xkeylog.c @@ -9,20 +9,38 @@ #include <X11/extensions/XKB.h> #include <sys/types.h> #include <signal.h> -#include <err.h> #include <ctype.h> #include <string.h> #include <stdio.h> #include <stdbool.h> +#include <stdarg.h> #include <stdlib.h> -const int mask = KeyPressMask | KeyReleaseMask | FocusChangeMask; +static int keysym_group; +static int xinput_op; +static int xkb_event; -int keysym_group; -int xinput_op; -int xkb_event; +static void +__attribute__((format(printf,1,2))) +die(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + fputs("xkeylog: ", stderr); + vfprintf(stderr, fmt, ap); + if (*fmt && fmt[strlen(fmt)-1] == ':') { + fputc(' ', stderr); + perror(NULL); + } else { + fputc('\n', stderr); + } + va_end(ap); -void + exit(1); +} + +static void check_support(Display *dpy, int *xinput_op) { int op, ev, err; @@ -30,19 +48,19 @@ check_support(Display *dpy, int *xinput_op) int ret; ret = XQueryExtension(dpy, "XInputExtension", xinput_op, &ev, &err); - if (!ret) errx(1, "missing XInput extension"); + if (!ret) die("missing XInput extension"); vmajor = 2; vminor = 0; ret = XIQueryVersion(dpy, &vmajor, &vminor); if (ret == BadRequest) - errx(1, "missing XInput2 support"); + die("missing XInput2 support"); ret = XkbQueryExtension(dpy, &op, &ev, &err, &vmajor, &vminor); - if (!ret) errx(1, "missing Xkb extension"); + if (!ret) die("missing Xkb extension"); } -void +static void setup_xinput(Display *dpy, Window root) { XIEventMask mask; @@ -50,7 +68,7 @@ setup_xinput(Display *dpy, Window root) mask.deviceid = XIAllMasterDevices; mask.mask_len = XIMaskLen(XI_LASTEVENT); mask.mask = calloc(mask.mask_len, 1); - if (!mask.mask) err(1, "calloc"); + if (!mask.mask) die("calloc:"); XISetMask(mask.mask, XI_RawKeyPress); XISetMask(mask.mask, XI_RawKeyRelease); @@ -60,7 +78,7 @@ setup_xinput(Display *dpy, Window root) free(mask.mask); } -void +static void handle_event(Display *dpy, Window root) { XGenericEventCookie *cookie; @@ -127,7 +145,5 @@ main(int argc, const char **argv) XkbGetState(dpy, XkbUseCoreKbd, &state); keysym_group = state.group; - while (1) { - handle_event(dpy, root); - } + while (1) handle_event(dpy, root); }