diff --git a/proj/intercept/src/intercept.c b/proj/intercept/src/intercept.c index bb45b3b..d843541 100644 --- a/proj/intercept/src/intercept.c +++ b/proj/intercept/src/intercept.c @@ -459,7 +459,7 @@ static void set_errno(const char *name, const char *msg_buf) { } } -static const char *getdomainstr(int domain) { +static const char *getdomainstr(const int domain) { switch (domain) { case_const(AF_UNSPEC); case_const(AF_UNIX); @@ -469,7 +469,7 @@ static const char *getdomainstr(int domain) { } } -static const char *getsocktype(int type) { +static const char *getsocktype(const int type) { switch (type) { case_const(SOCK_STREAM); case_const(SOCK_DGRAM); @@ -482,6 +482,31 @@ static const char *getsocktype(int type) { } } +static const char *getaddrinfoerror(const int ret) { + switch (ret) { + case 0: return "SUCCESS"; + case_const(EAI_BADFLAGS); + case_const(EAI_NONAME); + case_const(EAI_AGAIN); + case_const(EAI_FAIL); + case_const(EAI_NODATA); + case_const(EAI_FAMILY); + case_const(EAI_SOCKTYPE); + case_const(EAI_SERVICE); + case_const(EAI_ADDRFAMILY); + case_const(EAI_MEMORY); + case_const(EAI_SYSTEM); + case_const(EAI_OVERFLOW); + case_const(EAI_INPROGRESS); + case_const(EAI_CANCELED); + case_const(EAI_NOTCANCELED); + case_const(EAI_ALLDONE); + case_const(EAI_INTR); + case_const(EAI_IDN_ENCODE); + default: return "?"; + } +} + static char *strtostr(char *ptr, char **end_ptr, char *buf) { if (ptr[0] != '"') return NULL; int i = 0, esc = 0, hex = 0; @@ -2287,15 +2312,52 @@ int sym(getaddrinfo)(const char *restrict node, const char *restrict service, co if (strncmp(msg_buf, "modify ", 7) == 0) { // TODO getaddrinfo modify fprintf(stderr, "intercept: %s: modify command not implemented\n", "getaddrinfo"); - } else if_return_int_errno(getaddrinfo) - else if_fail_int_errno(getaddrinfo) - else if_invalid(getaddrinfo) + } else if (strncmp(msg_buf, "return ", 7) == 0) { + char *end_ptr = NULL; + long val = strtol(msg_buf + 7, &end_ptr, 0); + if (end_ptr != NULL && end_ptr[0] == 0 && end_ptr != msg_buf + 7) { + msg("return %i:%s; errno %s", val, getaddrinfoerror(val), strerrorname_np(errno)); + return val; + } else { + fprintf(stderr, "intercept: %s: invalid args in return command: '%s'\n", "getaddrinfo", msg_buf + 7); + } + } else if_fail { + int ret = -1; + if (strcmp(msg_buf + 5, "EAI_ADDRFAMILY") == 0) { + ret = EAI_ADDRFAMILY; + } else if (strcmp(msg_buf + 5, "EAI_AGAIN") == 0) { + ret = EAI_AGAIN; + } else if (strcmp(msg_buf + 5, "EAI_BADFLAGS") == 0) { + ret = EAI_BADFLAGS; + } else if (strcmp(msg_buf + 5, "EAI_FAIL") == 0) { + ret = EAI_FAIL; + } else if (strcmp(msg_buf + 5, "EAI_FAMILY") == 0) { + ret = EAI_FAMILY; + } else if (strcmp(msg_buf + 5, "EAI_MEMORY") == 0) { + ret = EAI_MEMORY; + } else if (strcmp(msg_buf + 5, "EAI_NODATA") == 0) { + ret = EAI_NODATA; + } else if (strcmp(msg_buf + 5, "EAI_NONAME") == 0) { + ret = EAI_NONAME; + } else if (strcmp(msg_buf + 5, "EAI_SERVICE") == 0) { + ret = EAI_SERVICE; + } else if (strcmp(msg_buf + 5, "EAI_SOCKTYPE") == 0) { + ret = EAI_SOCKTYPE; + } else if (strcmp(msg_buf + 5, "EAI_SYSTEM") == 0) { + ret = EAI_SYSTEM; + } else { + ret = EAI_SYSTEM; + set_errno("getaddrinfo", msg_buf); + } + msg("return %i:%s; errno %s", ret, getaddrinfoerror(ret), strerrorname_np(errno)); + return ret; + } else if_invalid(getaddrinfo) } const int ret = __real_getaddrinfo(node, service, hints, res); if (res != NULL) { - msg("return %i; errno %s; res=%qi", ret, strerrorname_np(errno), *res); + msg("return %i:%s; res=%qi", ret, getaddrinfoerror(ret), *res); } else { - msg("return %i; errno %s", ret, strerrorname_np(errno)); + msg("return %i:%s", ret, getaddrinfoerror(ret)); } return ret; } diff --git a/proj/server/src/intercept/__init__.py b/proj/server/src/intercept/__init__.py index 88ed488..007672a 100644 --- a/proj/server/src/intercept/__init__.py +++ b/proj/server/src/intercept/__init__.py @@ -486,7 +486,7 @@ class Handler(StreamRequestHandler): def before_getaddrinfo(self, node: PointerTo[bytes], service: PointerTo[bytes], hints: PointerTo[list[StructAddrInfo]], res_ptr: Pointer) -> str: raise NotImplementedError() def after_getaddrinfo(self, node: PointerTo[bytes], service: PointerTo[bytes], hints: PointerTo[list[StructAddrInfo]], res_ptr: Pointer, - ret_value: int, errno: str = None, res: PointerTo[list[StructAddrInfo]] = None) -> None: + ret_value: Constant, errno: str = None, res: PointerTo[list[StructAddrInfo]] = None) -> None: raise NotImplementedError() def before_freeaddrinfo(self, res: Pointer) -> str: raise NotImplementedError()