/*
- * Copyright (C) 2016, 2017, 2018 "IoT.bzh"
+ * Copyright (C) 2015-2020 "IoT.bzh"
* Author: José Bollo <jose.bollo@iot.bzh>
*
* Licensed under the Apache License, Version 2.0 (the "License");
#include "afb-hsrv.h"
#include "afb-fdev.h"
#include "afb-socket.h"
+
#include "fdev.h"
#include "verbose.h"
#include "locale-root.h"
-
-#include "afb-systemd.h"
+#include "systemd.h"
#include "jobs.h"
#define JSON_CONTENT "application/json"
struct hsrv_itf *next;
struct afb_hsrv *hsrv;
struct fdev *fdev;
- char uri[1];
+ char uri[];
};
struct hsrv_handler {
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
int rgni;
- itf->fdev = afb_socket_open_fdev(itf->uri, 1);
+ itf->fdev = afb_socket_open_fdev_scheme(itf->uri, 1, "tcp");
if (!itf->fdev) {
ERROR("can't create socket %s", itf->uri);
return 0;
}
fdev_set_events(itf->fdev, EPOLLIN);
fdev_set_callback(itf->fdev, hsrv_itf_callback, itf);
+ memset(&addr, 0, sizeof addr);
lenaddr = (socklen_t)sizeof addr;
getsockname(fdev_fd(itf->fdev), &addr, &lenaddr);
- rgni = getnameinfo(&addr, lenaddr, hbuf, sizeof hbuf, sbuf, sizeof sbuf, NI_NUMERICSERV);
- if (rgni != 0) {
- ERROR("getnameinfo returned %d: %s", rgni, gai_strerror(rgni));
- hbuf[0] = sbuf[0] = '?';
- hbuf[1] = sbuf[1] = 0;
+ if (addr.sa_family == AF_INET && !((struct sockaddr_in*)&addr)->sin_addr.s_addr) {
+ strncpy(hbuf, "*", NI_MAXHOST);
+ sprintf(sbuf, "%d", (int)ntohs(((struct sockaddr_in*)&addr)->sin_port));
+ } else {
+ rgni = getnameinfo(&addr, lenaddr, hbuf, sizeof hbuf, sbuf, sizeof sbuf, NI_NUMERICSERV);
+ if (rgni != 0) {
+ ERROR("getnameinfo returned %d: %s", rgni, gai_strerror(rgni));
+ hbuf[0] = sbuf[0] = '?';
+ hbuf[1] = sbuf[1] = 0;
+ }
}
NOTICE("Listening interface %s:%s", hbuf, sbuf);
return 1;
{
struct hsrv_itf *itf;
- itf = malloc(sizeof *itf + strlen(uri));
+ itf = malloc(sizeof *itf + 1 + strlen(uri));
if (itf == NULL)
return -1;
return 0;
}
return afb_hsrv_add_interface(hsrv, buffer);
-}
\ No newline at end of file
+}