proj/intercept.c: Add capability to show line numbers
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
|
||||
CC=gcc
|
||||
CFLAGS=-std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809L -g
|
||||
CFLAGS=-std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809L
|
||||
|
||||
.PHONY: all clean
|
||||
all: default
|
||||
|
||||
@@ -215,8 +215,8 @@ func_def(ssize_t, recvmsg)(int, struct msghdr *, int);
|
||||
#define flag_str(flags, name, buf) if (flags & name) strcat(buf, #name "|")
|
||||
|
||||
#define ret_addr __builtin_return_address(0)
|
||||
#define ret_str ": %p (%s+%p%s%s)"
|
||||
#define ret_data ret_addr, info.dli_fname, (long)ret_addr - (long)info.dli_fbase, info.dli_sname ? ", " : "", info.dli_sname ? info.dli_sname : ""
|
||||
#define ret_str ": %p (%s+%p%s%s%s%s)"
|
||||
#define ret_data ret_addr, info.dli_fname, (long)ret_addr - (long)info.dli_fbase, info.dli_sname ? ", " : "", info.dli_sname ? info.dli_sname : "", get_file_line(src_file, (long)ret_addr - (long)info.dli_fbase, &info) != -1 ? ", " : "", src_file
|
||||
#define lib_idx (((long)info.dli_fbase >> 12) & 0xFFF)
|
||||
|
||||
#define if_fail if (strncmp(msg_buf, "fail ", 5) == 0)
|
||||
@@ -316,6 +316,18 @@ func_def(ssize_t, recvmsg)(int, struct msghdr *, int);
|
||||
|
||||
#define if_error(err) if (strcmp(msg_buf + 5, #err) == 0) { errno = err; }
|
||||
|
||||
struct line_debug_info {
|
||||
long addr;
|
||||
int line_num;
|
||||
char filename[64];
|
||||
};
|
||||
|
||||
struct obj_debug_info {
|
||||
unsigned long addr;
|
||||
int n_entries;
|
||||
struct line_debug_info *entries;
|
||||
};
|
||||
|
||||
static void set_errno(const char *name, const char *msg_buf) {
|
||||
char *end_ptr = NULL;
|
||||
long val = strtol(msg_buf + 5, &end_ptr, 0);
|
||||
@@ -573,6 +585,7 @@ static int intercept = 0;
|
||||
static int verbosity = 0;
|
||||
static uint8_t func_flags[256];
|
||||
static uint8_t lib_flags[0x1000];
|
||||
static struct obj_debug_info line_info[16];
|
||||
|
||||
static size_t msg_bytes(char *buf, size_t maxlen, size_t len, const char *str, int flags) {
|
||||
size_t offset = flags & 1 ? snprintf(buf, maxlen, "\"") : snprintf(buf, maxlen, "%p:\"", str);
|
||||
@@ -838,6 +851,116 @@ static void fin(void) {
|
||||
mode = 0, intercept = 0;
|
||||
}
|
||||
|
||||
static int get_file_line(char *buf, long rel_ret, Dl_info *info) {
|
||||
buf[0] = 0;
|
||||
const long idx = ((long)info->dli_fbase >> 12) & 0xFFF;
|
||||
if (!(lib_flags[idx] & 2))
|
||||
return -1;
|
||||
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if (line_info[i].addr != (long)info->dli_fbase)
|
||||
continue;
|
||||
for (int j = line_info[i].n_entries - 1; j >= 0; j--) {
|
||||
struct line_debug_info *entry = &line_info[i].entries[j];
|
||||
if (entry->addr < rel_ret) {
|
||||
sprintf(buf, "%s:%i", entry->filename, entry->line_num);
|
||||
return entry->line_num;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int iter_lib_debug(struct dl_phdr_info *info, size_t size, void *data) {
|
||||
const long idx = ((long)info->dlpi_addr >> 12) & 0xFFF;
|
||||
if (!lib_flags[idx]) return 0;
|
||||
|
||||
char name_buf[256] = "";
|
||||
const char *name = info->dlpi_name;
|
||||
if (name[0] == 0) {
|
||||
if (readlink("/proc/self/exe", name_buf, sizeof(name_buf)) == -1)
|
||||
return 0;
|
||||
name = name_buf;
|
||||
}
|
||||
|
||||
int fds[2];
|
||||
__real_pipe(fds);
|
||||
pid_t pid = __real_fork();
|
||||
switch (pid) {
|
||||
case -1:
|
||||
return 0;
|
||||
case 0:
|
||||
// child
|
||||
__real_close(fds[0]); // close read end
|
||||
__real_close(STDERR_FILENO);
|
||||
__real_dup2(fds[1], STDOUT_FILENO);
|
||||
__real_close(fds[1]);
|
||||
__real_execle("/bin/readelf", "readelf", "--debug-dump=decodedline", name, NULL, NULL);
|
||||
default:
|
||||
// parent
|
||||
__real_close(fds[1]); // close write end
|
||||
}
|
||||
|
||||
char state = 0;
|
||||
char buf[1024];
|
||||
char line[3][256] = {0};
|
||||
int n = 0, n_entries = 0;
|
||||
struct line_debug_info *entries = NULL;
|
||||
for (ssize_t num = -2; (num != -1 && num != 0) || (num == -1 && errno == EINTR); num = __real_read(fds[0], buf, sizeof(buf))) {
|
||||
for (int i = 0; i < num; i++) {
|
||||
char ch = buf[i];
|
||||
if (state == 0 && ch == 'S') {
|
||||
state = 'S';
|
||||
} else if (state == 'S' && ch == 't') {
|
||||
state = 't';
|
||||
} else if (state == 't' && ch == 'm') {
|
||||
state = 'm';
|
||||
} else if (state == 'm' && ch == 't') {
|
||||
state = 'T';
|
||||
} else if (state == 'T' && ch == '\n') {
|
||||
state = 'A';
|
||||
} else if (state == 'A' || state == 'B' || state == 'C') {
|
||||
// file name | line number | starting address
|
||||
if (ch == ' ') {
|
||||
if (n == 0)
|
||||
continue;
|
||||
state++;
|
||||
n = 0;
|
||||
continue;
|
||||
}
|
||||
line[state - 'A'][n++] = ch;
|
||||
line[state - 'A'][n] = 0;
|
||||
} else if (state == 'D' && ch == '\n') {
|
||||
state = 'A';
|
||||
long addr = strtol(line[2], NULL, 0);
|
||||
long line_num = strtol(line[1], NULL, 0);
|
||||
entries = __real_realloc(entries, ++n_entries * sizeof(struct line_debug_info));
|
||||
entries[n_entries - 1].addr = addr;
|
||||
entries[n_entries - 1].line_num = (int)line_num;
|
||||
strncpy(entries[n_entries - 1].filename, line[0], sizeof(entries[n_entries - 1].filename));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (__real_waitpid(pid, NULL, 0) == -1) {
|
||||
if (errno != EINTR) return 0;
|
||||
}
|
||||
|
||||
if (n_entries > 0) {
|
||||
lib_flags[idx] |= 2;
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if (line_info[i].addr != 0)
|
||||
continue;
|
||||
line_info[i].addr = info->dlpi_addr;
|
||||
line_info[i].n_entries = n_entries;
|
||||
line_info[i].entries = entries;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iter_lib(struct dl_phdr_info *info, size_t size, void *data) {
|
||||
char *name1 = (char *)data;
|
||||
const char *name2 = info->dlpi_name;
|
||||
@@ -989,12 +1112,16 @@ static void init(void) {
|
||||
dl_iterate_phdr(iter_lib, lib_names[i]);
|
||||
}
|
||||
}
|
||||
|
||||
memset(line_info, 0, sizeof(line_info));
|
||||
dl_iterate_phdr(iter_lib_debug, NULL);
|
||||
}
|
||||
|
||||
void *sym(malloc)(size_t size) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_malloc] || !lib_flags[lib_idx]) return __real_malloc(size);
|
||||
char src_file[256];
|
||||
msg("malloc(%li)" ret_str, size, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1013,6 +1140,7 @@ void *sym(calloc)(size_t nmemb, size_t size) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_calloc] || !lib_flags[lib_idx]) return __real_calloc(nmemb, size);
|
||||
char src_file[256];
|
||||
msg("calloc(%li, %li)" ret_str, nmemb, size, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1031,6 +1159,7 @@ void *sym(realloc)(void *ptr, size_t size) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_realloc] || !lib_flags[lib_idx]) return __real_realloc(ptr, size);
|
||||
char src_file[256];
|
||||
msg("realloc(%p, %li)" ret_str, ptr, size, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1049,6 +1178,7 @@ void *sym(reallocarray)(void *ptr, size_t nmemb, size_t size) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_reallocarray] || !lib_flags[lib_idx]) return __real_reallocarray(ptr, nmemb, size);
|
||||
char src_file[256];
|
||||
msg("reallocarray(%p, %li)" ret_str, ptr, size, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1067,6 +1197,7 @@ void sym(free)(void *ptr) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_free] || !lib_flags[lib_idx]) { __real_free(ptr); return; }
|
||||
char src_file[256];
|
||||
msg("free(%p)" ret_str, ptr, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1083,6 +1214,7 @@ int sym(getopt)(const int argc, char *const argv[], const char *shortopts) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_getopt] || !lib_flags[lib_idx]) return __real_getopt(argc, argv, shortopts);
|
||||
char src_file[256];
|
||||
msg("getopt(%i, %as, %es)" ret_str, argc, argc, argv, shortopts, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1103,6 +1235,7 @@ void sym(exit)(int status) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_exit] || !lib_flags[lib_idx]) __real_exit(status);
|
||||
char src_file[256];
|
||||
msg("exit(%i)" ret_str, status, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1117,6 +1250,7 @@ ssize_t sym(read)(int fildes, void *buf, size_t nbyte) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_read] || !lib_flags[lib_idx]) return __real_read(fildes, buf, nbyte);
|
||||
char src_file[256];
|
||||
msg("read(%i, %p, %i)" ret_str, fildes, buf, nbyte, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1141,6 +1275,7 @@ ssize_t sym(pread)(int fildes, void *buf, size_t nbyte, off_t offset) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_pread] || !lib_flags[lib_idx]) return __real_pread(fildes, buf, nbyte, offset);
|
||||
char src_file[256];
|
||||
msg("pread(%i, %p, %i, %i)" ret_str, fildes, buf, nbyte, offset, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1165,6 +1300,7 @@ ssize_t sym(write)(int fildes, const void *buf, size_t nbyte) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_write] || !lib_flags[lib_idx]) return __real_write(fildes, buf, nbyte);
|
||||
char src_file[256];
|
||||
msg("write(%i, %eb, %i)" ret_str, fildes, nbyte, buf, nbyte, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1185,6 +1321,7 @@ ssize_t sym(pwrite)(int fildes, const void *buf, size_t nbyte, off_t offset) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_pwrite] || !lib_flags[lib_idx]) return __real_pwrite(fildes, buf, nbyte, offset);
|
||||
char src_file[256];
|
||||
msg("pwrite(%i, %eb, %i, %i)" ret_str, fildes, nbyte, buf, nbyte, offset, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1205,6 +1342,7 @@ int sym(close)(int fildes) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_close] || !lib_flags[lib_idx]) return __real_close(fildes);
|
||||
char src_file[256];
|
||||
msg("close(%i)" ret_str, fildes, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1286,6 +1424,7 @@ int sym(sigaction)(int sig, const struct sigaction *restrict act, struct sigacti
|
||||
if (!verbosity) {
|
||||
msg("sigaction(%i:%s, %p:{}, %p)" ret_str, sig, sigstr, act, oact, ret_addr);
|
||||
} else {
|
||||
char src_file[256];
|
||||
msg("sigaction(%i:%s, %p:{sa_flags: 0x%x:%s, %s: %p, sa_mask: [%s]}, %p)" ret_str, sig, sigstr, act, act->sa_flags, flgstr, name, ptr, maskstr, oact, ret_data);
|
||||
}
|
||||
} else {
|
||||
@@ -1337,6 +1476,7 @@ int sym(sem_init)(sem_t *sem, int pshared, unsigned int value) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_init] || !lib_flags[lib_idx]) return __real_sem_init(sem, pshared, value);
|
||||
char src_file[256];
|
||||
msg("sem_init(%p, %i, %u)" ret_str, sem, pshared, value, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1368,9 +1508,11 @@ sem_t *sym(sem_open)(const char *name, int oflag, ...) {
|
||||
value = va_arg(args, unsigned int);
|
||||
va_end(args);
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_open] || !lib_flags[lib_idx]) return __real_sem_open(name, oflag, mode_arg, value);
|
||||
char src_file[256];
|
||||
msg("sem_open(%es, 0%o:%s, 0%03o, %u)" ret_str, name, oflag, ostr, mode_arg, value, ret_data);
|
||||
} else {
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_open] || !lib_flags[lib_idx]) return __real_sem_open(name, oflag);
|
||||
char src_file[256];
|
||||
msg("sem_open(%es, 0%o:|%s)" ret_str, name, oflag, ostr, ret_data);
|
||||
}
|
||||
|
||||
@@ -1443,6 +1585,7 @@ int sym(sem_post)(sem_t *sem) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_post] || !lib_flags[lib_idx]) return __real_sem_post(sem);
|
||||
char src_file[256];
|
||||
msg("sem_post(%p)" ret_str, sem, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1461,6 +1604,7 @@ int sym(sem_wait)(sem_t *sem) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_wait] || !lib_flags[lib_idx]) return __real_sem_wait(sem);
|
||||
char src_file[256];
|
||||
msg("sem_wait(%p)" ret_str, sem, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1479,6 +1623,7 @@ int sym(sem_trywait)(sem_t *sem) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_trywait] || !lib_flags[lib_idx]) return __real_sem_trywait(sem);
|
||||
char src_file[256];
|
||||
msg("sem_trywait(%p)" ret_str, sem, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1497,6 +1642,7 @@ int sym(sem_timedwait)(sem_t *restrict sem, const struct timespec *restrict abs_
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_timedwait] || !lib_flags[lib_idx]) return __real_sem_timedwait(sem, abs_timeout);
|
||||
char src_file[256];
|
||||
msg("sem_timedwait(%p, %qt)" ret_str, sem, abs_timeout, ret_data);
|
||||
struct timespec overwrite;
|
||||
if (mode >= 4) {
|
||||
@@ -1544,6 +1690,7 @@ int sym(sem_getvalue)(sem_t *restrict sem, int *restrict value) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_getvalue] || !lib_flags[lib_idx]) return __real_sem_getvalue(sem, value);
|
||||
char src_file[256];
|
||||
msg("sem_getvalue(%p, %p)" ret_str, sem, value, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1566,6 +1713,7 @@ int sym(sem_close)(sem_t *sem) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_close] || !lib_flags[lib_idx]) return __real_sem_close(sem);
|
||||
char src_file[256];
|
||||
msg("sem_close(%p)" ret_str, sem, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1584,6 +1732,7 @@ int sym(sem_unlink)(const char *name) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_unlink] || !lib_flags[lib_idx]) return __real_sem_unlink(name);
|
||||
char src_file[256];
|
||||
msg("sem_unlink(%es)" ret_str, name, ret_data);
|
||||
char overwrite[BUFFER_SIZE];
|
||||
if (mode >= 4) {
|
||||
@@ -1617,6 +1766,7 @@ int sym(sem_destroy)(sem_t *sem) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_destroy] || !lib_flags[lib_idx]) return __real_sem_destroy(sem);
|
||||
char src_file[256];
|
||||
msg("sem_destroy(%p)" ret_str, sem, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1643,6 +1793,7 @@ int sym(shm_open)(const char *name, int oflag, mode_t mode_arg) {
|
||||
flag_str(oflag, O_TRUNC, ostr);
|
||||
if (oflag & ~(O_RDONLY | O_RDWR | O_CREAT | O_EXCL | O_TRUNC)) strcat(ostr, "?|");
|
||||
|
||||
char src_file[256];
|
||||
msg("shm_open(%es, 0%o:%s, 0%03o)" ret_str, name, oflag, ostr, mode_arg, ret_data);
|
||||
char overwrite[BUFFER_SIZE];
|
||||
if (mode >= 4) {
|
||||
@@ -1713,6 +1864,7 @@ int sym(shm_unlink)(const char *name) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_shm_unlink] || !lib_flags[lib_idx]) return __real_shm_unlink(name);
|
||||
char src_file[256];
|
||||
msg("shm_unlink(%es)" ret_str, name, ret_data);
|
||||
char overwrite[BUFFER_SIZE];
|
||||
if (mode >= 4) {
|
||||
@@ -1759,6 +1911,7 @@ void *sym(mmap)(void *addr, size_t len, int prot, int flags, int fildes, off_t o
|
||||
flag_str(prot, MAP_ANONYMOUS, fstr);
|
||||
if (prot & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS)) strcat(fstr, "?|");
|
||||
|
||||
char src_file[256];
|
||||
msg("mmap(%p, %i, 0x%x:%s, %0x%x:%s, %i, %i)" ret_str, addr, len, prot, pstr, flags, fstr, fildes, off, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1781,6 +1934,7 @@ int sym(munmap)(void *addr, size_t len) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_munmap] || !lib_flags[lib_idx]) return __real_munmap(addr, len);
|
||||
char src_file[256];
|
||||
msg("munmap(%p, %i)" ret_str, addr, len, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1799,6 +1953,7 @@ int sym(ftruncate)(int fildes, off_t length) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_ftruncate] || !lib_flags[lib_idx]) return __real_ftruncate(fildes, length);
|
||||
char src_file[256];
|
||||
msg("ftruncate(%i, %i)" ret_str, fildes, length, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1834,6 +1989,7 @@ pid_t sym(wait)(int *stat_loc) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_wait] || !lib_flags[lib_idx]) return __real_wait(stat_loc);
|
||||
char src_file[256];
|
||||
msg("wait(%p)" ret_str, stat_loc, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1862,6 +2018,7 @@ pid_t sym(waitpid)(pid_t pid, int *stat_loc, int options) {
|
||||
flag_str(options, WUNTRACED, ostr);
|
||||
if (options & ~(WCONTINUED | WNOHANG | WUNTRACED)) strcat(ostr, "?|");
|
||||
|
||||
char src_file[256];
|
||||
msg("waitpid(%i, %p, 0x%x:%s)" ret_str, pid, stat_loc, options, ostr, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1906,6 +2063,7 @@ int sym(execl)(const char *pathname, const char *arg, ...) {
|
||||
arg_buf_ptr += msg_str(arg_buf_ptr, sizeof(arg_buf) - (arg_buf_ptr - arg_buf), arg_vec[i], 0);
|
||||
}
|
||||
|
||||
char src_file[256];
|
||||
msg("execl(%es, %es%s)" ret_str, pathname, arg, arg_buf, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1947,6 +2105,7 @@ int sym(execlp)(const char *file, const char *arg, ...) {
|
||||
arg_buf_ptr += msg_str(arg_buf_ptr, sizeof(arg_buf) - (arg_buf_ptr - arg_buf), arg_vec[i], 0);
|
||||
}
|
||||
|
||||
char src_file[256];
|
||||
msg("execlp(%es, %es%s)" ret_str, file, arg, arg_buf, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -1994,6 +2153,7 @@ int sym(execle)(const char *pathname, const char *arg, ...) {
|
||||
}
|
||||
|
||||
int len = 0; for (len = 0; envp[len] != NULL; len++) {}
|
||||
char src_file[256];
|
||||
msg("execle(%es, %es%s, %as)" ret_str, pathname, arg, arg_buf, len, envp, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2015,6 +2175,7 @@ int sym(execv)(const char *pathname, char *const argv[]) {
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execv] || !lib_flags[lib_idx]) return __real_execv(pathname, argv);
|
||||
int len = 0; for (len = 0; argv[len] != NULL; len++) {}
|
||||
char src_file[256];
|
||||
msg("execv(%es, %as)" ret_str, pathname, len, argv, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2036,6 +2197,7 @@ int sym(execvp)(const char *file, char *const argv[]) {
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execvp] || !lib_flags[lib_idx]) return __real_execvp(file, argv);
|
||||
int len = 0; for (len = 0; argv[len] != NULL; len++) {}
|
||||
char src_file[256];
|
||||
msg("execvp(%es, %as)" ret_str, file, len, argv, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2058,6 +2220,7 @@ int sym(execvpe)(const char *file, char *const argv[], char *const envp[]) {
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execvpe] || !lib_flags[lib_idx]) return __real_execvpe(file, argv, envp);
|
||||
int len1 = 0; for (len1 = 0; argv[len1] != NULL; len1++) {}
|
||||
int len2 = 0; for (len2 = 0; envp[len2] != NULL; len2++) {}
|
||||
char src_file[256];
|
||||
msg("execvpe(%es, %as, %as)" ret_str, file, len1, argv, len2, envp, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2080,6 +2243,7 @@ int sym(execve)(const char *pathname, char *const argv[], char *const envp[]) {
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execve] || !lib_flags[lib_idx]) return __real_execve(pathname, argv, envp);
|
||||
int len1 = 0; for (len1 = 0; argv[len1] != NULL; len1++) {}
|
||||
int len2 = 0; for (len2 = 0; envp[len2] != NULL; len2++) {}
|
||||
char src_file[256];
|
||||
msg("execve(%es, %as, %as)" ret_str, pathname, len1, argv, len2, envp, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2102,6 +2266,7 @@ int sym(fexecve)(int fd, char *const argv[], char *const envp[]) {
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_fexecve] || !lib_flags[lib_idx]) return __real_fexecve(fd, argv, envp);
|
||||
int len1 = 0; for (len1 = 0; argv[len1] != NULL; len1++) {}
|
||||
int len2 = 0; for (len2 = 0; envp[len2] != NULL; len2++) {}
|
||||
char src_file[256];
|
||||
msg("fexecve(%i, %as, %as)" ret_str, fd, len1, argv, len2, envp, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2122,6 +2287,7 @@ int sym(pipe)(int fildes[2]) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_pipe] || !lib_flags[lib_idx]) return __real_pipe(fildes);
|
||||
char src_file[256];
|
||||
msg("pipe(%p)" ret_str, fildes, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2142,6 +2308,7 @@ int sym(dup)(int oldfd) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_dup] || !lib_flags[lib_idx]) return __real_dup(oldfd);
|
||||
char src_file[256];
|
||||
msg("dup(%i)" ret_str, oldfd, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2160,6 +2327,7 @@ int sym(dup2)(int oldfd, int newfd) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_dup2] || !lib_flags[lib_idx]) return __real_dup2(oldfd, newfd);
|
||||
char src_file[256];
|
||||
msg("dup2(%i, %i)" ret_str, oldfd, newfd, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2181,6 +2349,7 @@ int sym(dup3)(int oldfd, int newfd, int flags) {
|
||||
char fstr[16] = "|";
|
||||
flag_str(flags, O_CLOEXEC, fstr);
|
||||
if (flags & ~(O_CLOEXEC)) strcat(fstr, "?|");
|
||||
char src_file[256];
|
||||
msg("dup3(%i, %i, 0%o:%s)" ret_str, oldfd, newfd, flags, fstr, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2199,6 +2368,7 @@ int sym(socket)(int domain, int type, int protocol) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_socket] || !lib_flags[lib_idx]) return __real_socket(domain, type, protocol);
|
||||
char src_file[256];
|
||||
msg("socket(%i:%s, %i:%s, %i)" ret_str, domain, getdomainstr(domain), type, getsocktype(type), protocol, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2219,6 +2389,7 @@ int sym(bind)(int sockfd, const struct sockaddr *address, socklen_t address_len)
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_bind] || !lib_flags[lib_idx]) return __real_bind(sockfd, address, address_len);
|
||||
char src_file[256];
|
||||
msg("bind(%i, %qa, %i)" ret_str, sockfd, address_len, address, address_len, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2239,6 +2410,7 @@ int sym(listen)(int sockfd, int backlog) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_listen] || !lib_flags[lib_idx]) return __real_listen(sockfd, backlog);
|
||||
char src_file[256];
|
||||
msg("listen(%i, %i)" ret_str, sockfd, backlog, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2257,6 +2429,7 @@ int sym(accept)(int sockfd, struct sockaddr *restrict address, socklen_t *restri
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_accept] || !lib_flags[lib_idx]) return __real_accept(sockfd, address, address_len);
|
||||
char src_file[256];
|
||||
msg("accept(%i, %p, %p)" ret_str, sockfd, address, address_len, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2285,6 +2458,7 @@ int sym(connect)(int sockfd, const struct sockaddr *address, socklen_t address_l
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_connect] || !lib_flags[lib_idx]) return __real_connect(sockfd, address, address_len);
|
||||
char src_file[256];
|
||||
msg("connect(%i, %qa, %i)" ret_str, sockfd, address_len, address, address_len, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2305,6 +2479,7 @@ int sym(getaddrinfo)(const char *restrict node, const char *restrict service, co
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_getaddrinfo] || !lib_flags[lib_idx]) return __real_getaddrinfo(node, service, hints, res);
|
||||
char src_file[256];
|
||||
msg("getaddrinfo(%es, %es, %qi, %p)" ret_str, node, service, hints, res, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2366,6 +2541,7 @@ void sym(freeaddrinfo)(struct addrinfo *res) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_freeaddrinfo] || !lib_flags[lib_idx]) { __real_freeaddrinfo(res); return; }
|
||||
char src_file[256];
|
||||
msg("freeaddrinfo(%p)" ret_str, res, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2393,6 +2569,7 @@ ssize_t sym(send)(int sockfd, const void *buf, size_t length, int flags) {
|
||||
flag_str(flags, MSG_FASTOPEN, fstr);
|
||||
if (flags & ~(MSG_CONFIRM | MSG_DONTROUTE | MSG_DONTWAIT | MSG_EOR | MSG_MORE | MSG_NOSIGNAL | MSG_OOB | MSG_FASTOPEN)) strcat(fstr, "?|");
|
||||
|
||||
char src_file[256];
|
||||
msg("send(%i, %eb, %i, 0x%x:%s)" ret_str, sockfd, length, buf, length, flags, fstr, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2424,6 +2601,7 @@ ssize_t sym(sendto)(int sockfd, const void *buf, size_t size, int flags, const s
|
||||
flag_str(flags, MSG_FASTOPEN, fstr);
|
||||
if (flags & ~(MSG_CONFIRM | MSG_DONTROUTE | MSG_DONTWAIT | MSG_EOR | MSG_MORE | MSG_NOSIGNAL | MSG_OOB | MSG_FASTOPEN)) strcat(fstr, "?|");
|
||||
|
||||
char src_file[256];
|
||||
msg("sendto(%i, %eb, %i, 0x%x:%s, %qa, %i)" ret_str, sockfd, size, buf, size, flags, fstr, addrlen, dest_addr, addrlen, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2455,6 +2633,7 @@ ssize_t sym(sendmsg)(int sockfd, const struct msghdr *message, int flags) {
|
||||
flag_str(flags, MSG_FASTOPEN, fstr);
|
||||
if (flags & ~(MSG_CONFIRM | MSG_DONTROUTE | MSG_DONTWAIT | MSG_EOR | MSG_MORE | MSG_NOSIGNAL | MSG_OOB | MSG_FASTOPEN)) strcat(fstr, "?|");
|
||||
|
||||
char src_file[256];
|
||||
msg("sendmsg(%i, %qm, 0x%x:%s)" ret_str, sockfd, message, flags, fstr, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2484,6 +2663,7 @@ ssize_t sym(recv)(int sockfd, void *buf, size_t size, int flags) {
|
||||
flag_str(flags, MSG_WAITALL, fstr);
|
||||
if (flags & ~(MSG_DONTWAIT | MSG_ERRQUEUE | MSG_OOB | MSG_PEEK | MSG_TRUNC | MSG_WAITALL)) strcat(fstr, "?|");
|
||||
|
||||
char src_file[256];
|
||||
msg("recv(%i, %p, %i, 0x%x:%s)" ret_str, sockfd, buf, size, flags, fstr, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2517,6 +2697,7 @@ ssize_t sym(recvfrom)(int sockfd, void *restrict buf, size_t size, int flags, st
|
||||
flag_str(flags, MSG_WAITALL, fstr);
|
||||
if (flags & ~(MSG_DONTWAIT | MSG_ERRQUEUE | MSG_OOB | MSG_PEEK | MSG_TRUNC | MSG_WAITALL)) strcat(fstr, "?|");
|
||||
|
||||
char src_file[256];
|
||||
msg("recvfrom(%i, %p, %i, 0x%x:%s, %p, %p)" ret_str, sockfd, buf, size, flags, fstr, addrlen, src_addr, addrlen, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
@@ -2555,6 +2736,7 @@ ssize_t sym(recvmsg)(int sockfd, struct msghdr *message, int flags) {
|
||||
flag_str(flags, MSG_WAITALL, fstr);
|
||||
if (flags & ~(MSG_CMSG_CLOEXEC | MSG_DONTWAIT | MSG_ERRQUEUE | MSG_OOB | MSG_PEEK | MSG_TRUNC | MSG_WAITALL)) strcat(fstr, "?|");
|
||||
|
||||
char src_file[256];
|
||||
msg("recvmsg(%i, %qm, 0x%x:%s)" ret_str, sockfd, msg, flags, fstr, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
|
||||
@@ -37,6 +37,14 @@ void do_sem(void) {
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 8; i++) {
|
||||
if (i & 1) {
|
||||
sem_post(&sem);
|
||||
} else {
|
||||
sem_post(&sem);
|
||||
}
|
||||
}
|
||||
|
||||
do_something();
|
||||
|
||||
sem_wait(&sem);
|
||||
|
||||
Reference in New Issue
Block a user