1
0

proj: Implement ftruncate

This commit is contained in:
2025-03-02 11:46:32 +01:00
parent cf71b7b9d1
commit d85f506a8d
3 changed files with 44 additions and 5 deletions

View File

@@ -45,6 +45,7 @@ static int (*__real_shm_open)(const char *, int, mode_t);
static int (*__real_shm_unlink)(const char *);
static void *(*__real_mmap)(void *, size_t, int, int, int, off_t);
static int (*__real_munmap)(void *, size_t);
extern int (*__real_ftruncate)(int, off_t);
#define load(name) \
if (((__real_ ## name) = dlsym(RTLD_NEXT, #name)) == NULL) { \
fprintf(stderr, "intercept: unable to load symbol '%s': %s", #name, strerror(errno)); \
@@ -75,6 +76,7 @@ extern int __real_shm_open(const char *, int, mode_t);
extern int __real_shm_unlink(const char *);
extern void *__real_mmap(void *, size_t, int, int, int, off_t);
extern int __real_munmap(void *, size_t);
extern int __real_ftruncate(int, off_t);
#define sym(name) __wrap_ ## name
#endif
@@ -210,6 +212,19 @@ extern int __real_munmap(void *, size_t);
msg("return %i; errno %s", -1, strerrorname_np(errno)); \
return -1; }
#define if_error_5_int_errno(name, err1, err2, err3, err4, err5) if (strncmp(buf, "fail ", 5) == 0) { \
if (strcmp(buf + 5, #err1) == 0) { errno = err1; \
} else if (strcmp(buf + 5, #err2) == 0) { errno = err2; \
} else if (strcmp(buf + 5, #err3) == 0) { errno = err3; \
} else if (strcmp(buf + 5, #err4) == 0) { errno = err4; \
} else if (strcmp(buf + 5, #err5) == 0) { errno = err5; \
} else { \
errno = 0; \
fprintf(stderr, "intercept: %s: invalid error code in fail command: '%s'\n", #name, buf + 5); \
} \
msg("return %i; errno %s", -1, strerrorname_np(errno)); \
return -1; }
#define if_error_7_int_errno(name, err1, err2, err3, err4, err5, err6, err7) if (strncmp(buf, "fail ", 5) == 0) { \
if (strcmp(buf + 5, #err1) == 0) { errno = err1; \
} else if (strcmp(buf + 5, #err2) == 0) { errno = err2; \
@@ -504,6 +519,7 @@ static void init(void) {
load(shm_unlink);
load(mmap);
load(munmap);
load(ftruncate);
#endif
atexit(fin);
const char *val = getenv("INTERCEPT");
@@ -1206,3 +1222,19 @@ int sym(munmap)(void *addr, size_t len) {
msg("return %i; errno %s", ret, strerrorname_np(errno));
return ret;
}
int sym(ftruncate)(int fildes, off_t length) {
init();
msg("ftruncate(%i, %i): %p", fildes, length);
if (mode >= 4) {
char buf[BUFFER_SIZE];
rcv(buf, sizeof(buf));
if_modify_int_int(ftruncate, int, fildes, off_t, length)
else if_return_int_errno(ftruncate)
else if_error_5_int_errno(ftruncate, EINTR, EINVAL, EFBIG, EIO, EBADF)
else if_invalid(ftruncate)
}
const int ret = __real_ftruncate(fildes, length);
msg("return %i; errno %s", ret, strerrorname_np(errno));
return ret;
}