mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-14 10:46:51 -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)
|
||||
{
|
||||
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 ®ist_
|
|||
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)));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue