mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-20 05:23:12 -07:00
Add chiaki_discovery_wakeup()
This commit is contained in:
parent
ed19f8610d
commit
e3afc11a35
3 changed files with 63 additions and 47 deletions
|
@ -97,37 +97,6 @@ void DiscoveryManager::SetActive(bool active)
|
||||||
|
|
||||||
void DiscoveryManager::SendWakeup(const QString &host, const QByteArray ®ist_key)
|
void DiscoveryManager::SendWakeup(const QString &host, const QByteArray ®ist_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;
|
QByteArray key = regist_key;
|
||||||
for(size_t i=0; i<key.size(); i++)
|
for(size_t i=0; i<key.size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -146,22 +115,7 @@ void DiscoveryManager::SendWakeup(const QString &host, const QByteArray ®ist_
|
||||||
throw Exception("Invalid regist key");
|
throw Exception("Invalid regist key");
|
||||||
}
|
}
|
||||||
|
|
||||||
ChiakiDiscoveryPacket packet = {};
|
ChiakiErrorCode err = chiaki_discovery_wakeup(&log, service_active ? &service.discovery : nullptr, host.toUtf8().constData(), credential);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(err != CHIAKI_ERR_SUCCESS)
|
if(err != CHIAKI_ERR_SUCCESS)
|
||||||
throw Exception(QString("Failed to send Packet: %1").arg(chiaki_error_string(err)));
|
throw Exception(QString("Failed to send Packet: %1").arg(chiaki_error_string(err)));
|
||||||
|
|
|
@ -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_start(ChiakiDiscoveryThread *thread, ChiakiDiscovery *discovery, ChiakiDiscoveryCb cb, void *cb_user);
|
||||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_thread_stop(ChiakiDiscoveryThread *thread);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -290,3 +290,59 @@ static void *discovery_thread_func(void *user)
|
||||||
|
|
||||||
return NULL;
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue