mirror of
https://github.com/moonlight-stream/moonlight-embedded.git
synced 2025-07-01 23:35:47 +00:00
Libgamestream doesn't print to console
This commit is contained in:
parent
06265eddad
commit
6c087f40dc
@ -47,6 +47,8 @@ static X509 *cert;
|
|||||||
static char cert_hex[4096];
|
static char cert_hex[4096];
|
||||||
static EVP_PKEY *privateKey;
|
static EVP_PKEY *privateKey;
|
||||||
|
|
||||||
|
const char* gs_error;
|
||||||
|
|
||||||
static int load_unique_id(const char* keyDirectory) {
|
static int load_unique_id(const char* keyDirectory) {
|
||||||
char uniqueFilePath[4096];
|
char uniqueFilePath[4096];
|
||||||
sprintf(uniqueFilePath, "%s/%s", keyDirectory, UNIQUE_FILE_NAME);
|
sprintf(uniqueFilePath, "%s/%s", keyDirectory, UNIQUE_FILE_NAME);
|
||||||
@ -94,12 +96,12 @@ static int load_cert(const char* keyDirectory) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fd == NULL) {
|
if (fd == NULL) {
|
||||||
fprintf(stderr, "Can't open certificate file\n");
|
gs_error = "Can't open certificate file";
|
||||||
return GS_FAILED;
|
return GS_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(cert = PEM_read_X509(fd, NULL, NULL, NULL))) {
|
if (!(cert = PEM_read_X509(fd, NULL, NULL, NULL))) {
|
||||||
fprintf(stderr, "Error loading cert into memory.\n");
|
gs_error = "Error loading cert into memory";
|
||||||
return GS_FAILED;
|
return GS_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +119,7 @@ static int load_cert(const char* keyDirectory) {
|
|||||||
|
|
||||||
fd = fopen(keyFilePath, "r");
|
fd = fopen(keyFilePath, "r");
|
||||||
if (fd == NULL) {
|
if (fd == NULL) {
|
||||||
fprintf(stderr, "Error loading key into memory.\n");
|
gs_error = "Error loading key into memory";
|
||||||
return GS_FAILED;
|
return GS_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,66 +196,38 @@ static int sign_it(const char *msg, size_t mlen, unsigned char **sig, size_t *sl
|
|||||||
*slen = 0;
|
*slen = 0;
|
||||||
|
|
||||||
EVP_MD_CTX *ctx = EVP_MD_CTX_create();
|
EVP_MD_CTX *ctx = EVP_MD_CTX_create();
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL)
|
||||||
fprintf(stderr, "EVP_MD_CTX_create failed, error 0x%lx\n", ERR_get_error());
|
return GS_FAILED;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const EVP_MD *md = EVP_get_digestbyname("SHA256");
|
const EVP_MD *md = EVP_get_digestbyname("SHA256");
|
||||||
if (md == NULL) {
|
if (md == NULL)
|
||||||
fprintf(stderr, "EVP_get_digestbyname failed, error 0x%lx\n", ERR_get_error());
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
int rc = EVP_DigestInit_ex(ctx, md, NULL);
|
int rc = EVP_DigestInit_ex(ctx, md, NULL);
|
||||||
if (rc != 1) {
|
if (rc != 1)
|
||||||
fprintf(stderr, "EVP_DigestInit_ex failed, error 0x%lx\n", ERR_get_error());
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
rc = EVP_DigestSignInit(ctx, NULL, md, NULL, pkey);
|
rc = EVP_DigestSignInit(ctx, NULL, md, NULL, pkey);
|
||||||
if (rc != 1) {
|
if (rc != 1)
|
||||||
fprintf(stderr, "EVP_DigestSignInit failed, error 0x%lx\n", ERR_get_error());
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
rc = EVP_DigestSignUpdate(ctx, msg, mlen);
|
rc = EVP_DigestSignUpdate(ctx, msg, mlen);
|
||||||
if (rc != 1) {
|
if (rc != 1)
|
||||||
fprintf(stderr, "EVP_DigestSignUpdate failed, error 0x%lx\n", ERR_get_error());
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
size_t req = 0;
|
size_t req = 0;
|
||||||
rc = EVP_DigestSignFinal(ctx, NULL, &req);
|
rc = EVP_DigestSignFinal(ctx, NULL, &req);
|
||||||
if (rc != 1) {
|
if (rc != 1 || !(req > 0))
|
||||||
fprintf(stderr, "EVP_DigestSignFinal failed (1), error 0x%lx\n", ERR_get_error());
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
if (!(req > 0)) {
|
|
||||||
fprintf(stderr, "EVP_DigestSignFinal failed (2), error 0x%lx\n", ERR_get_error());
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
*sig = OPENSSL_malloc(req);
|
*sig = OPENSSL_malloc(req);
|
||||||
if (*sig == NULL) {
|
if (*sig == NULL)
|
||||||
fprintf(stderr, "OPENSSL_malloc failed, error 0x%lx\n", ERR_get_error());
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
*slen = req;
|
*slen = req;
|
||||||
rc = EVP_DigestSignFinal(ctx, *sig, slen);
|
rc = EVP_DigestSignFinal(ctx, *sig, slen);
|
||||||
if (rc != 1) {
|
if (rc != 1 || req != *slen)
|
||||||
fprintf(stderr, "EVP_DigestSignFinal failed (3), return code %d, error 0x%lx\n", rc,
|
|
||||||
ERR_get_error());
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
if (req != *slen) {
|
|
||||||
fprintf(stderr, "EVP_DigestSignFinal failed, mismatched signature sizes %ld, %ld\n",
|
|
||||||
req, *slen);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = GS_OK;
|
result = GS_OK;
|
||||||
|
|
||||||
@ -269,17 +243,15 @@ int gs_pair(PSERVER_DATA server, char* pin) {
|
|||||||
char url[4096];
|
char url[4096];
|
||||||
|
|
||||||
if (server->paired) {
|
if (server->paired) {
|
||||||
fprintf(stderr, "Already paired\n");
|
gs_error = "Already paired";
|
||||||
return GS_WRONG_STATE;
|
return GS_WRONG_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server->currentGame != 0) {
|
if (server->currentGame != 0) {
|
||||||
fprintf(stderr, "The computer is currently in a game. You must close the game before pairing.\n");
|
gs_error = "The computer is currently in a game. You must close the game before pairing";
|
||||||
return GS_WRONG_STATE;
|
return GS_WRONG_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Please enter the following PIN on the target PC: %s\n", pin);
|
|
||||||
|
|
||||||
unsigned char salt_data[16];
|
unsigned char salt_data[16];
|
||||||
char salt_hex[33];
|
char salt_hex[33];
|
||||||
RAND_bytes(salt_data, 16);
|
RAND_bytes(salt_data, 16);
|
||||||
@ -357,7 +329,7 @@ int gs_pair(PSERVER_DATA server, char* pin) {
|
|||||||
unsigned char *signature = NULL;
|
unsigned char *signature = NULL;
|
||||||
size_t s_len;
|
size_t s_len;
|
||||||
if (sign_it(client_secret_data, 16, &signature, &s_len, privateKey) != GS_OK) {
|
if (sign_it(client_secret_data, 16, &signature, &s_len, privateKey) != GS_OK) {
|
||||||
fprintf(stderr, "Failed to sign data\n");
|
gs_error = "Failed to sign data";
|
||||||
ret = GS_FAILED;
|
ret = GS_FAILED;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
|
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "errors.h"
|
||||||
|
|
||||||
#include <avahi-client/client.h>
|
#include <avahi-client/client.h>
|
||||||
#include <avahi-client/lookup.h>
|
#include <avahi-client/lookup.h>
|
||||||
|
|
||||||
@ -33,7 +35,7 @@ static AvahiSimplePoll *simple_poll = NULL;
|
|||||||
|
|
||||||
static void client_callback(AvahiClient *c, AvahiClientState state, void *userdata) {
|
static void client_callback(AvahiClient *c, AvahiClientState state, void *userdata) {
|
||||||
if (state == AVAHI_CLIENT_FAILURE) {
|
if (state == AVAHI_CLIENT_FAILURE) {
|
||||||
fprintf(stderr, "Server connection failure: %s\n", avahi_strerror(avahi_client_errno(c)));
|
gs_error = "Server connection failure";
|
||||||
avahi_simple_poll_quit(simple_poll);
|
avahi_simple_poll_quit(simple_poll);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -58,12 +60,12 @@ static void browse_callback(AvahiServiceBrowser *b, AvahiIfIndex interface, Avah
|
|||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case AVAHI_BROWSER_FAILURE:
|
case AVAHI_BROWSER_FAILURE:
|
||||||
fprintf(stderr, "(Discover) %s\n", avahi_strerror(avahi_client_errno(avahi_service_browser_get_client(b))));
|
gs_error = "Server browser failure";
|
||||||
avahi_simple_poll_quit(simple_poll);
|
avahi_simple_poll_quit(simple_poll);
|
||||||
break;
|
break;
|
||||||
case AVAHI_BROWSER_NEW:
|
case AVAHI_BROWSER_NEW:
|
||||||
if (!(avahi_service_resolver_new(c, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, userdata)))
|
if (!(avahi_service_resolver_new(c, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, userdata)))
|
||||||
fprintf(stderr, "Failed to resolve service '%s': %s\n", name, avahi_strerror(avahi_client_errno(c)));
|
gs_error = "Failed to resolve service";
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case AVAHI_BROWSER_REMOVE:
|
case AVAHI_BROWSER_REMOVE:
|
||||||
@ -76,19 +78,19 @@ void gs_discover_server(char* dest) {
|
|||||||
AvahiServiceBrowser *sb = NULL;
|
AvahiServiceBrowser *sb = NULL;
|
||||||
|
|
||||||
if (!(simple_poll = avahi_simple_poll_new())) {
|
if (!(simple_poll = avahi_simple_poll_new())) {
|
||||||
fprintf(stderr, "Failed to create simple poll object.\n");
|
gs_error = "Failed to create simple poll object";
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
int error;
|
int error;
|
||||||
client = avahi_client_new(avahi_simple_poll_get(simple_poll), 0, client_callback, NULL, &error);
|
client = avahi_client_new(avahi_simple_poll_get(simple_poll), 0, client_callback, NULL, &error);
|
||||||
if (!client) {
|
if (!client) {
|
||||||
fprintf(stderr, "Failed to create client: %s\n", avahi_strerror(error));
|
gs_error = "Failed to create client";
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(sb = avahi_service_browser_new(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_nvstream._tcp", NULL, 0, browse_callback, dest))) {
|
if (!(sb = avahi_service_browser_new(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_nvstream._tcp", NULL, 0, browse_callback, dest))) {
|
||||||
fprintf(stderr, "Failed to create service browser: %s\n", avahi_strerror(avahi_client_errno(client)));
|
gs_error = "Failed to create service browser";
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,3 +25,5 @@
|
|||||||
#define GS_INVALID -3
|
#define GS_INVALID -3
|
||||||
#define GS_WRONG_STATE -4
|
#define GS_WRONG_STATE -4
|
||||||
#define GS_IO_ERROR -5
|
#define GS_IO_ERROR -5
|
||||||
|
|
||||||
|
const char* gs_error;
|
||||||
|
@ -48,9 +48,6 @@ CERT_KEY_PAIR mkcert_generate() {
|
|||||||
mkcert(&x509, &pkey, NUM_BITS, SERIAL, NUM_YEARS);
|
mkcert(&x509, &pkey, NUM_BITS, SERIAL, NUM_YEARS);
|
||||||
|
|
||||||
p12 = PKCS12_create("limelight", "GameStream", pkey, x509, NULL, 0, 0, 0, 0, 0);
|
p12 = PKCS12_create("limelight", "GameStream", pkey, x509, NULL, 0, 0, 0, 0, 0);
|
||||||
if (p12 == NULL) {
|
|
||||||
fprintf(stderr, "Error generating a valid PKCS12 certificate.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef OPENSSL_NO_ENGINE
|
#ifndef OPENSSL_NO_ENGINE
|
||||||
ENGINE_cleanup();
|
ENGINE_cleanup();
|
||||||
|
@ -46,10 +46,8 @@ static void XMLCALL _xml_start_applist_element(void *userData, const char *name,
|
|||||||
struct xml_query *search = (struct xml_query*) userData;
|
struct xml_query *search = (struct xml_query*) userData;
|
||||||
if (strcmp("App", name) == 0) {
|
if (strcmp("App", name) == 0) {
|
||||||
PAPP_LIST app = malloc(sizeof(APP_LIST));
|
PAPP_LIST app = malloc(sizeof(APP_LIST));
|
||||||
if (app == NULL) {
|
if (app == NULL)
|
||||||
fprintf(stderr, "Not enough memory\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
app->next = (PAPP_LIST) search->data;
|
app->next = (PAPP_LIST) search->data;
|
||||||
search->data = app;
|
search->data = app;
|
||||||
@ -81,10 +79,8 @@ static void XMLCALL _xml_write_data(void *userData, const XML_Char *s, int len)
|
|||||||
struct xml_query *search = (struct xml_query*) userData;
|
struct xml_query *search = (struct xml_query*) userData;
|
||||||
if (search->start > 0) {
|
if (search->start > 0) {
|
||||||
search->memory = realloc(search->memory, search->size + len + 1);
|
search->memory = realloc(search->memory, search->size + len + 1);
|
||||||
if(search->memory == NULL) {
|
if(search->memory == NULL)
|
||||||
fprintf(stderr, "Not enough memory\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&(search->memory[search->size]), s, len);
|
memcpy(&(search->memory[search->size]), s, len);
|
||||||
search->size += len;
|
search->size += len;
|
||||||
@ -104,7 +100,7 @@ int xml_search(char* data, size_t len, char* node, char** result) {
|
|||||||
XML_SetCharacterDataHandler(parser, _xml_write_data);
|
XML_SetCharacterDataHandler(parser, _xml_write_data);
|
||||||
if (! XML_Parse(parser, data, len, 1)) {
|
if (! XML_Parse(parser, data, len, 1)) {
|
||||||
int code = XML_GetErrorCode(parser);
|
int code = XML_GetErrorCode(parser);
|
||||||
fprintf(stderr, "XML Error: %s\n", XML_ErrorString(code));
|
gs_error = XML_ErrorString(code);
|
||||||
free(search.memory);
|
free(search.memory);
|
||||||
return GS_INVALID;
|
return GS_INVALID;
|
||||||
} else if (search.memory == NULL)
|
} else if (search.memory == NULL)
|
||||||
@ -127,7 +123,7 @@ int xml_applist(char* data, size_t len, PAPP_LIST app_list) {
|
|||||||
XML_SetCharacterDataHandler(parser, _xml_write_data);
|
XML_SetCharacterDataHandler(parser, _xml_write_data);
|
||||||
if (! XML_Parse(parser, data, len, 1)) {
|
if (! XML_Parse(parser, data, len, 1)) {
|
||||||
int code = XML_GetErrorCode(parser);
|
int code = XML_GetErrorCode(parser);
|
||||||
fprintf(stderr, "XML Error %s\n", XML_ErrorString(code));
|
gs_error = XML_ErrorString(code);
|
||||||
return GS_INVALID;
|
return GS_INVALID;
|
||||||
}
|
}
|
||||||
app_list = (PAPP_LIST) query.data;
|
app_list = (PAPP_LIST) query.data;
|
||||||
|
@ -304,7 +304,12 @@ int main(int argc, char* argv[]) {
|
|||||||
} else if (strcmp("pair", action) == 0) {
|
} else if (strcmp("pair", action) == 0) {
|
||||||
char pin[5];
|
char pin[5];
|
||||||
sprintf(pin, "%d%d%d%d", (int)random() % 10, (int)random() % 10, (int)random() % 10, (int)random() % 10);
|
sprintf(pin, "%d%d%d%d", (int)random() % 10, (int)random() % 10, (int)random() % 10, (int)random() % 10);
|
||||||
gs_pair(server, &pin[0]);
|
printf("Please enter the following PIN on the target PC: %s\n", pin);
|
||||||
|
if (gs_pair(server, &pin[0]) != GS_OK) {
|
||||||
|
fprintf("Failed to pair to server: %s\n", gs_error);
|
||||||
|
} else {
|
||||||
|
printf("Succesfully paired\n");
|
||||||
|
}
|
||||||
} else if (strcmp("quit", action) == 0) {
|
} else if (strcmp("quit", action) == 0) {
|
||||||
pair_check(server);
|
pair_check(server);
|
||||||
gs_quit_app(server);
|
gs_quit_app(server);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user