https://man7.org/linux/man-pages/man3/freeaddrinfo.3p.html says: "[EAI_SYSTEM] A system error occurred; the error code can be found in errno." Which makes a lot of sense. The function can fall because of name-resolution specific problem (EAI_NODATA). But otherwise it must be a plain old generic error that can be expressed with errno, so you should look in errno. It's not explicitly said. But IMHO it's clear that it would be a bug to return EAI_SYSTEM without setting errno/setting errno to zero. But then https://man7.org/linux/man-pages/man3/getaddrinfo.3.html replaces it with: "EAI_SYSTEM Other system error, check errno for details." Which, I'm not a native speaker, but it seems to me to leave returning EAI_SYSTEM and setting errno to 0 more open to interpretation. You can argue that in such a case errno == 0 simply means "no details".
It seems reasonable to have doubts about if (ret == EAI_SYSTEM && errno == 0) can happen, with the current wording. Perhaps we can use a wording similar to most pages' RETURN VALUE section: [ EAI_SYSTEM Other system error; errno is set to indicate the error. ] This is more explicit in that "errno is _set_". Hmm?