1
0
mirror of http://galexander.org/git/simplesshd.git synced 2025-01-07 13:40:54 +00:00

Make a naive IP address decoder for the case where the library's

getnameinfo() doesn't work (Android 16).
This commit is contained in:
Greg Alexander 2019-06-16 22:14:29 -04:00
parent 12ccb85024
commit 7879c603fe
2 changed files with 44 additions and 3 deletions

7
NOTES
View File

@ -830,6 +830,13 @@ Testing with emulated x86 Android 21 (KK 5.0)... It seems to work fine.
It resolve my IP to the string "127.0.0.1", anyways. rsync seems to It resolve my IP to the string "127.0.0.1", anyways. rsync seems to
work, and start-on-boot in the background works. work, and start-on-boot in the background works.
Anyways, I made a naive thing to decode an IP address to a numeric
string, in case getnameinfo() fails. It is working for me in the ARM
Android 16 now. It generates a reasonable string even though it
presumably fails to use the library lookup. It starts on boot as a
background service. And rsync and scp work. Only need to test on my
Moto X now.
XXX - test with Android 16, and on my Moto X, and emulated 26, and emulated 28. XXX - test with Android 16, and on my Moto X, and emulated 26, and emulated 28.

View File

@ -615,6 +615,42 @@ void get_socket_address(int fd, char **local_host, char **local_port,
} }
} }
static void
lastditch_lookup(struct sockaddr_storage *addr, char *host, char *port)
{
if (addr->ss_family == AF_INET) {
struct sockaddr_in *sa = (struct sockaddr_in *)addr;
unsigned int ip = ntohl(sa->sin_addr.s_addr);
sprintf(host, "%u.%u.%u.%u", ((ip>>24)&0xff), ((ip>>16)&0xff),
((ip>>8)&0xff), (ip&0xff));
sprintf(port, "%d", ntohs(sa->sin_port));
} else if (addr->ss_family == AF_INET6) {
struct sockaddr_in6 *sa = (struct sockaddr_in6 *)addr;
sprintf(host, "%02X%02X:%02X%02X:%02X%02X:%02X%02X:"
"%02X%02X:%02X%02X:%02X%02X:%02X%02X",
sa->sin6_addr.in6_u.u6_addr8[0],
sa->sin6_addr.in6_u.u6_addr8[1],
sa->sin6_addr.in6_u.u6_addr8[2],
sa->sin6_addr.in6_u.u6_addr8[3],
sa->sin6_addr.in6_u.u6_addr8[4],
sa->sin6_addr.in6_u.u6_addr8[5],
sa->sin6_addr.in6_u.u6_addr8[6],
sa->sin6_addr.in6_u.u6_addr8[7],
sa->sin6_addr.in6_u.u6_addr8[8],
sa->sin6_addr.in6_u.u6_addr8[9],
sa->sin6_addr.in6_u.u6_addr8[10],
sa->sin6_addr.in6_u.u6_addr8[11],
sa->sin6_addr.in6_u.u6_addr8[12],
sa->sin6_addr.in6_u.u6_addr8[13],
sa->sin6_addr.in6_u.u6_addr8[14],
sa->sin6_addr.in6_u.u6_addr8[15]);
sprintf(port, "%d", ntohs(sa->sin6_port));
} else {
sprintf(port, "unknown%u", (unsigned)addr->ss_family);
strcpy(port, "unknown");
}
}
/* Return a string representation of the socket address passed. The return /* Return a string representation of the socket address passed. The return
* value is allocated with malloc() */ * value is allocated with malloc() */
void getaddrstring(struct sockaddr_storage* addr, void getaddrstring(struct sockaddr_storage* addr,
@ -663,9 +699,7 @@ void getaddrstring(struct sockaddr_storage* addr,
return; return;
} else { } else {
/* if we can't do a numeric lookup, something's gone terribly wrong */ /* if we can't do a numeric lookup, something's gone terribly wrong */
dropbear_log(LOG_WARNING, "Failed lookup: %s", gai_strerror(ret)); lastditch_lookup(addr, host, serv);
sprintf(host, "unknown%u", ((struct sockaddr *)addr)->sa_family);
strcpy(serv, "unknown");
} }
} }