proj/test-memory: Add getline() and getdelim()
This commit is contained in:
@@ -26,7 +26,8 @@ main_intercept: bin/main.o src/intercept.c
|
||||
--wrap=ftruncate,--wrap=fork,--wrap=wait,--wrap=waitpid,--wrap=pipe,--wrap=dup,--wrap=dup2,--wrap=dup3,\
|
||||
--wrap=execl,--wrap=execlp,--wrap=execle,--wrap=execv,--wrap=execvp,--wrap=execvpe,--wrap=execve,--wrap=fexecve,\
|
||||
--wrap=socket,--wrap=bind,--wrap=listen,--wrap=accept,--wrap=connect,--wrap=getaddrinfo,--wrap=freeaddrinfo,\
|
||||
--wrap=send,--wrap=sendto,--wrap=sendmsg,--wrap=recv,--wrap=recvfrom,--wrap=recvmsg
|
||||
--wrap=send,--wrap=sendto,--wrap=sendmsg,--wrap=recv,--wrap=recvfrom,--wrap=recvmsg,\
|
||||
--wrap=getline,--wrap=getdelim
|
||||
|
||||
clean:
|
||||
rm -rf main_intercept bin/* *.so *.ko *.o
|
||||
|
||||
@@ -94,6 +94,8 @@ func_def(ssize_t, sendmsg)(int, const struct msghdr *, int);
|
||||
func_def(ssize_t, recv)(int, void *, size_t, int);
|
||||
func_def(ssize_t, recvfrom)(int, void *, size_t, int, struct sockaddr *, socklen_t *);
|
||||
func_def(ssize_t, recvmsg)(int, struct msghdr *, int);
|
||||
func_def(ssize_t, getline)(char **, size_t *, FILE *);
|
||||
func_def(ssize_t, getdelim)(char **, size_t *, int, FILE *);
|
||||
|
||||
#define func_idx_malloc 0
|
||||
#define func_idx_calloc 1
|
||||
@@ -151,6 +153,8 @@ func_def(ssize_t, recvmsg)(int, struct msghdr *, int);
|
||||
#define func_idx_recv 53
|
||||
#define func_idx_recvfrom 54
|
||||
#define func_idx_recvmsg 55
|
||||
#define func_idx_getline 56
|
||||
#define func_idx_getdelim 57
|
||||
|
||||
#define FUNCTIONS \
|
||||
X(malloc) \
|
||||
@@ -208,7 +212,9 @@ func_def(ssize_t, recvmsg)(int, struct msghdr *, int);
|
||||
X(sendmsg) \
|
||||
X(recv) \
|
||||
X(recvfrom) \
|
||||
X(recvmsg)
|
||||
X(recvmsg) \
|
||||
X(getline) \
|
||||
X(getdelim)
|
||||
|
||||
#define case_const(name) case name: return #name
|
||||
|
||||
@@ -2756,3 +2762,54 @@ ssize_t sym(recvmsg)(int sockfd, struct msghdr *message, int flags) {
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t sym(getline)(char **restrict lineptr, size_t *restrict n, FILE *restrict stream) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_getline] || !lib_flags[lib_idx]) return __real_getline(lineptr, n, stream);
|
||||
char src_file[256];
|
||||
msg("getline(%p:%p, %p:%li, %p)" ret_str, lineptr, lineptr != NULL ? lineptr : NULL, n, n != NULL ? *n : 0, stream, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
rcv(msg_buf, sizeof(msg_buf));
|
||||
if (strncmp(msg_buf, "modify ", 7) == 0) {
|
||||
// TODO getline modify
|
||||
fprintf(stderr, "intercept: %s: modify command not implemented\n", "getline");
|
||||
} else if_return_int_errno(getline)
|
||||
else if_fail_int_errno(getline)
|
||||
else if_invalid(getline)
|
||||
}
|
||||
ssize_t ret = __real_getline(lineptr, n, stream);
|
||||
if (ret >= 0) {
|
||||
msg("return %li; errno %s; n=%li, line=%eb", ret, strerrorname_np(errno), *n, ret, *lineptr);
|
||||
} else {
|
||||
msg("return %li; errno %s; n=%li", ret, strerrorname_np(errno), *n);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t sym(getdelim)(char **restrict lineptr, size_t *restrict n, int delim, FILE *restrict stream) {
|
||||
init();
|
||||
Dl_info info;
|
||||
if (!dladdr(ret_addr, &info) || !func_flags[func_idx_getdelim] || !lib_flags[lib_idx]) return __real_getdelim(lineptr, n, delim, stream);
|
||||
char src_file[256];
|
||||
msg("getdelim(%p:%p, %p:%li, %p)" ret_str, lineptr, lineptr != NULL ? lineptr : NULL, n, n != NULL ? *n : 0, stream, ret_data);
|
||||
if (mode >= 4) {
|
||||
char msg_buf[BUFFER_SIZE];
|
||||
rcv(msg_buf, sizeof(msg_buf));
|
||||
if (strncmp(msg_buf, "modify ", 7) == 0) {
|
||||
// TODO getdelim modify
|
||||
fprintf(stderr, "intercept: %s: modify command not implemented\n", "getdelim");
|
||||
} else if_return_int_errno(getdelim)
|
||||
else if_fail_int_errno(getdelim)
|
||||
else if_invalid(getdelim)
|
||||
}
|
||||
ssize_t ret = __real_getdelim(lineptr, n, delim, stream);
|
||||
if (ret >= 0) {
|
||||
msg("return %li; errno %s; n=%li, line=%eb", ret, strerrorname_np(errno), *n, ret, *lineptr);
|
||||
} else {
|
||||
msg("return %li; errno %s; n=%li", ret, strerrorname_np(errno), *n);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user