Add chiaki_discovery_wakeup()

This commit is contained in:
Florian Märkl 2019-10-25 14:28:02 +02:00
commit e3afc11a35
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
3 changed files with 63 additions and 47 deletions

View file

@ -97,37 +97,6 @@ void DiscoveryManager::SetActive(bool active)
void DiscoveryManager::SendWakeup(const QString &host, const QByteArray &regist_key)
{
addrinfo *addrinfos;
int r = getaddrinfo(host.toLocal8Bit().constData(), nullptr, nullptr, &addrinfos);
if(r != 0)
{
CHIAKI_LOGE(&log, "DiscoveryManager failed to getaddrinfo for wakeup");
throw Exception("Failed to getaddrinfo");
}
sockaddr addr = {};
socklen_t addr_len = 0;
for(addrinfo *ai=addrinfos; ai; ai=ai->ai_next)
{
if(ai->ai_family != AF_INET)
continue;
//if(ai->ai_protocol != IPPROTO_UDP)
// continue;
if(ai->ai_addrlen > sizeof(addr))
continue;
std::memcpy(&addr, ai->ai_addr, ai->ai_addrlen);
addr_len = ai->ai_addrlen;
break;
}
freeaddrinfo(addrinfos);
if(!addr_len)
{
CHIAKI_LOGE(&log, "DiscoveryManager failed to get suitable address from getaddrinfo for wakeup");
throw Exception("Failed to get addr from getaddrinfo");
}
((sockaddr_in *)&addr)->sin_port = htons(CHIAKI_DISCOVERY_PORT);
QByteArray key = regist_key;
for(size_t i=0; i<key.size(); i++)
{
@ -146,22 +115,7 @@ void DiscoveryManager::SendWakeup(const QString &host, const QByteArray &regist_
throw Exception("Invalid regist key");
}
ChiakiDiscoveryPacket packet = {};
packet.cmd = CHIAKI_DISCOVERY_CMD_WAKEUP;
packet.user_credential = credential;
ChiakiErrorCode err;
if(service_active)
err = chiaki_discovery_send(&service.discovery, &packet, &addr, addr_len);
else
{
ChiakiDiscovery discovery;
err = chiaki_discovery_init(&discovery, &log, AF_INET);
if(err != CHIAKI_ERR_SUCCESS)
throw Exception(QString("Failed to init Discovery: %1").arg(chiaki_error_string(err)));
err = chiaki_discovery_send(&discovery, &packet, &addr, addr_len);
chiaki_discovery_fini(&discovery);
}
ChiakiErrorCode err = chiaki_discovery_wakeup(&log, service_active ? &service.discovery : nullptr, host.toUtf8().constData(), credential);
if(err != CHIAKI_ERR_SUCCESS)
throw Exception(QString("Failed to send Packet: %1").arg(chiaki_error_string(err)));

View file

@ -112,6 +112,12 @@ typedef struct chiaki_discovery_thread_t
CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_thread_start(ChiakiDiscoveryThread *thread, ChiakiDiscovery *discovery, ChiakiDiscoveryCb cb, void *cb_user);
CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_thread_stop(ChiakiDiscoveryThread *thread);
/**
* Convenience function to send a wakeup packet
* @param discovery Discovery to send the packet on. May be NULL, in which case a new temporary Discovery will be created
*/
CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_wakeup(ChiakiLog *log, ChiakiDiscovery *discovery, const char *host, uint64_t user_credential);
#ifdef __cplusplus
}
#endif

View file

@ -290,3 +290,59 @@ static void *discovery_thread_func(void *user)
return NULL;
}
CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_wakeup(ChiakiLog *log, ChiakiDiscovery *discovery, const char *host, uint64_t user_credential)
{
struct addrinfo *addrinfos;
int r = getaddrinfo(host, NULL, NULL, &addrinfos); // TODO: this blocks, use something else
if(r != 0)
{
CHIAKI_LOGE(log, "DiscoveryManager failed to getaddrinfo for wakeup");
return CHIAKI_ERR_NETWORK;
}
struct sockaddr addr = {};
socklen_t addr_len = 0;
for(struct addrinfo *ai=addrinfos; ai; ai=ai->ai_next)
{
if(ai->ai_family != AF_INET)
continue;
//if(ai->ai_protocol != IPPROTO_UDP)
// continue;
if(ai->ai_addrlen > sizeof(addr))
continue;
memcpy(&addr, ai->ai_addr, ai->ai_addrlen);
addr_len = ai->ai_addrlen;
break;
}
freeaddrinfo(addrinfos);
if(!addr_len)
{
CHIAKI_LOGE(log, "DiscoveryManager failed to get suitable address from getaddrinfo for wakeup");
return CHIAKI_ERR_UNKNOWN;
}
((struct sockaddr_in *)&addr)->sin_port = htons(CHIAKI_DISCOVERY_PORT);
ChiakiDiscoveryPacket packet = {};
packet.cmd = CHIAKI_DISCOVERY_CMD_WAKEUP;
packet.user_credential = user_credential;
ChiakiErrorCode err;
if(discovery)
err = chiaki_discovery_send(discovery, &packet, &addr, addr_len);
else
{
ChiakiDiscovery tmp_discovery;
err = chiaki_discovery_init(&tmp_discovery, log, AF_INET);
if(err != CHIAKI_ERR_SUCCESS)
{
CHIAKI_LOGE(log, "Failed to init temporary discovery for wakeup: %s", chiaki_error_string(err));
return err;
}
err = chiaki_discovery_send(&tmp_discovery, &packet, &addr, addr_len);
chiaki_discovery_fini(&tmp_discovery);
}
return err;
}