|
@@ -312,6 +312,42 @@ static AVLFG random_state;
|
|
|
|
|
|
static FILE *logfile = NULL;
|
|
|
|
|
|
+/* FIXME: make ffserver work with IPv6 */
|
|
|
+/* resolve host with also IP address parsing */
|
|
|
+static int resolve_host(struct in_addr *sin_addr, const char *hostname)
|
|
|
+{
|
|
|
+
|
|
|
+ if (!ff_inet_aton(hostname, sin_addr)) {
|
|
|
+#if HAVE_GETADDRINFO
|
|
|
+ struct addrinfo *ai, *cur;
|
|
|
+ struct addrinfo hints;
|
|
|
+ memset(&hints, 0, sizeof(hints));
|
|
|
+ hints.ai_family = AF_INET;
|
|
|
+ if (getaddrinfo(hostname, NULL, &hints, &ai))
|
|
|
+ return -1;
|
|
|
+ /* getaddrinfo returns a linked list of addrinfo structs.
|
|
|
+ * Even if we set ai_family = AF_INET above, make sure
|
|
|
+ * that the returned one actually is of the correct type. */
|
|
|
+ for (cur = ai; cur; cur = cur->ai_next) {
|
|
|
+ if (cur->ai_family == AF_INET) {
|
|
|
+ *sin_addr = ((struct sockaddr_in *)cur->ai_addr)->sin_addr;
|
|
|
+ freeaddrinfo(ai);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ freeaddrinfo(ai);
|
|
|
+ return -1;
|
|
|
+#else
|
|
|
+ struct hostent *hp;
|
|
|
+ hp = gethostbyname(hostname);
|
|
|
+ if (!hp)
|
|
|
+ return -1;
|
|
|
+ memcpy(sin_addr, hp->h_addr_list[0], sizeof(struct in_addr));
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static char *ctime1(char *buf2)
|
|
|
{
|
|
|
time_t ti;
|