-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathilog.c
More file actions
89 lines (73 loc) · 1.82 KB
/
ilog.c
File metadata and controls
89 lines (73 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// This is free and unencumbered software released into the public domain.
// For more information, see LICENSE.
#include "util.h"
#include "ilog.h"
#include <stdlib.h>
#include <stdatomic.h>
#include <sys/random.h>
#define ILOG_BASE "se.ilog.dump"
struct ilog *ilogptr;
int ilog_enable;
__attribute__((constructor)) void
ilog_init(void) {
size_t alloc = 0x1000;
ilogptr = malloc(sizeof(struct ilog) + sizeof(struct event) * alloc);
ilogptr->size = 0;
ilogptr->alloc = alloc;
ilog_enable = 0;
xensure(ilogptr);
}
void
ilog_dump_file(const char *fname) {
FILE *f = fopen(fname, "w+");
fwrite(ilogptr->data, sizeof(struct event), ilogptr->size, f);
fflush(f);
fclose(f);
}
void
ilog_dump(void) {
static atomic_int lock;
int expect = 0;
if (atomic_compare_exchange_strong(&lock, &expect, 1) == 0) {
return;
}
size_t uuid;
char fname[sizeof(ILOG_BASE) + 16 + 1];
ssize_t ret = getrandom(&uuid, sizeof(uuid), 0);
uuid = ret + uuid;
sprintf(fname, "%s%016lx", ILOG_BASE, uuid);
ilog_dump_file(fname);
atomic_store(&lock, 0);
}
void
ilog_dump_sig(int sig) {
(void)sig;
ilog_dump();
}
void
ilog_push(SDL_Event *ev) {
size_t alloc = ilogptr->alloc * 2;
struct ilog *bk;
struct event e = { .mod = ev->key.keysym.mod
, .key = ev->key.keysym.sym
, .type = ev->type
};
if (ilogptr->size == ilogptr->alloc) {
bk = reallocflexarr((void **)&ilogptr, sizeof(struct ilog), alloc
, sizeof(*ev)
);
if (bk == NULL) {
ilog_dump();
xensure(bk);
}
ilogptr = bk;
ilogptr->alloc = alloc;
}
ilogptr->data[ilogptr->size++] = e;
}
__attribute__((destructor)) void
ilog_dump_fini(void) {
if (ilog_enable) {
ilog_dump_file(ILOG_BASE);
}
}