From 6c087f40dc9db2e85af1c721e3efce84b4ca6bf3 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Thu, 23 Jul 2015 13:06:47 +0200 Subject: [PATCH] Libgamestream doesn't print to console --- libgamestream/client.c | 62 +++++++++++----------------------------- libgamestream/discover.c | 14 +++++---- libgamestream/errors.h | 2 ++ libgamestream/mkcert.c | 3 -- libgamestream/xml.c | 12 +++----- src/main.c | 7 ++++- 6 files changed, 37 insertions(+), 63 deletions(-) diff --git a/libgamestream/client.c b/libgamestream/client.c index 0070806..f427c1a 100644 --- a/libgamestream/client.c +++ b/libgamestream/client.c @@ -47,6 +47,8 @@ static X509 *cert; static char cert_hex[4096]; static EVP_PKEY *privateKey; +const char* gs_error; + static int load_unique_id(const char* keyDirectory) { char uniqueFilePath[4096]; sprintf(uniqueFilePath, "%s/%s", keyDirectory, UNIQUE_FILE_NAME); @@ -94,12 +96,12 @@ static int load_cert(const char* keyDirectory) { } if (fd == NULL) { - fprintf(stderr, "Can't open certificate file\n"); + gs_error = "Can't open certificate file"; return GS_FAILED; } 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; } @@ -117,7 +119,7 @@ static int load_cert(const char* keyDirectory) { fd = fopen(keyFilePath, "r"); if (fd == NULL) { - fprintf(stderr, "Error loading key into memory.\n"); + gs_error = "Error loading key into memory"; 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; EVP_MD_CTX *ctx = EVP_MD_CTX_create(); - if (ctx == NULL) { - fprintf(stderr, "EVP_MD_CTX_create failed, error 0x%lx\n", ERR_get_error()); - return -1; - } + if (ctx == NULL) + return GS_FAILED; const EVP_MD *md = EVP_get_digestbyname("SHA256"); - if (md == NULL) { - fprintf(stderr, "EVP_get_digestbyname failed, error 0x%lx\n", ERR_get_error()); + if (md == NULL) goto cleanup; - } int rc = EVP_DigestInit_ex(ctx, md, NULL); - if (rc != 1) { - fprintf(stderr, "EVP_DigestInit_ex failed, error 0x%lx\n", ERR_get_error()); + if (rc != 1) goto cleanup; - } rc = EVP_DigestSignInit(ctx, NULL, md, NULL, pkey); - if (rc != 1) { - fprintf(stderr, "EVP_DigestSignInit failed, error 0x%lx\n", ERR_get_error()); + if (rc != 1) goto cleanup; - } rc = EVP_DigestSignUpdate(ctx, msg, mlen); - if (rc != 1) { - fprintf(stderr, "EVP_DigestSignUpdate failed, error 0x%lx\n", ERR_get_error()); + if (rc != 1) goto cleanup; - } size_t req = 0; rc = EVP_DigestSignFinal(ctx, NULL, &req); - if (rc != 1) { - fprintf(stderr, "EVP_DigestSignFinal failed (1), error 0x%lx\n", ERR_get_error()); + if (rc != 1 || !(req > 0)) goto cleanup; - } - - if (!(req > 0)) { - fprintf(stderr, "EVP_DigestSignFinal failed (2), error 0x%lx\n", ERR_get_error()); - goto cleanup; - } *sig = OPENSSL_malloc(req); - if (*sig == NULL) { - fprintf(stderr, "OPENSSL_malloc failed, error 0x%lx\n", ERR_get_error()); + if (*sig == NULL) goto cleanup; - } *slen = req; rc = EVP_DigestSignFinal(ctx, *sig, slen); - if (rc != 1) { - fprintf(stderr, "EVP_DigestSignFinal failed (3), return code %d, error 0x%lx\n", rc, - ERR_get_error()); + if (rc != 1 || req != *slen) goto cleanup; - } - - if (req != *slen) { - fprintf(stderr, "EVP_DigestSignFinal failed, mismatched signature sizes %ld, %ld\n", - req, *slen); - goto cleanup; - } result = GS_OK; @@ -269,17 +243,15 @@ int gs_pair(PSERVER_DATA server, char* pin) { char url[4096]; if (server->paired) { - fprintf(stderr, "Already paired\n"); + gs_error = "Already paired"; return GS_WRONG_STATE; } 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; } - printf("Please enter the following PIN on the target PC: %s\n", pin); - unsigned char salt_data[16]; char salt_hex[33]; RAND_bytes(salt_data, 16); @@ -357,7 +329,7 @@ int gs_pair(PSERVER_DATA server, char* pin) { unsigned char *signature = NULL; size_t s_len; 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; goto cleanup; } diff --git a/libgamestream/discover.c b/libgamestream/discover.c index 4550d4e..89d59c0 100644 --- a/libgamestream/discover.c +++ b/libgamestream/discover.c @@ -17,6 +17,8 @@ * along with Moonlight; if not, see . */ +#include "errors.h" + #include #include @@ -33,7 +35,7 @@ static AvahiSimplePoll *simple_poll = NULL; static void client_callback(AvahiClient *c, AvahiClientState state, void *userdata) { 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); } } @@ -58,12 +60,12 @@ static void browse_callback(AvahiServiceBrowser *b, AvahiIfIndex interface, Avah switch (event) { 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); break; case AVAHI_BROWSER_NEW: 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; case AVAHI_BROWSER_REMOVE: @@ -76,19 +78,19 @@ void gs_discover_server(char* dest) { AvahiServiceBrowser *sb = NULL; 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; } int error; client = avahi_client_new(avahi_simple_poll_get(simple_poll), 0, client_callback, NULL, &error); if (!client) { - fprintf(stderr, "Failed to create client: %s\n", avahi_strerror(error)); + gs_error = "Failed to create client"; goto cleanup; } 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; } diff --git a/libgamestream/errors.h b/libgamestream/errors.h index 2e428f9..a68510c 100644 --- a/libgamestream/errors.h +++ b/libgamestream/errors.h @@ -25,3 +25,5 @@ #define GS_INVALID -3 #define GS_WRONG_STATE -4 #define GS_IO_ERROR -5 + +const char* gs_error; diff --git a/libgamestream/mkcert.c b/libgamestream/mkcert.c index c8e0369..0b95a84 100644 --- a/libgamestream/mkcert.c +++ b/libgamestream/mkcert.c @@ -48,9 +48,6 @@ CERT_KEY_PAIR mkcert_generate() { mkcert(&x509, &pkey, NUM_BITS, SERIAL, NUM_YEARS); 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 ENGINE_cleanup(); diff --git a/libgamestream/xml.c b/libgamestream/xml.c index 8842e86..3f4ea7f 100644 --- a/libgamestream/xml.c +++ b/libgamestream/xml.c @@ -46,10 +46,8 @@ static void XMLCALL _xml_start_applist_element(void *userData, const char *name, struct xml_query *search = (struct xml_query*) userData; if (strcmp("App", name) == 0) { PAPP_LIST app = malloc(sizeof(APP_LIST)); - if (app == NULL) { - fprintf(stderr, "Not enough memory\n"); + if (app == NULL) return; - } app->next = (PAPP_LIST) search->data; 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; if (search->start > 0) { search->memory = realloc(search->memory, search->size + len + 1); - if(search->memory == NULL) { - fprintf(stderr, "Not enough memory\n"); + if(search->memory == NULL) return; - } memcpy(&(search->memory[search->size]), s, 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); if (! XML_Parse(parser, data, len, 1)) { int code = XML_GetErrorCode(parser); - fprintf(stderr, "XML Error: %s\n", XML_ErrorString(code)); + gs_error = XML_ErrorString(code); free(search.memory); return GS_INVALID; } 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); if (! XML_Parse(parser, data, len, 1)) { int code = XML_GetErrorCode(parser); - fprintf(stderr, "XML Error %s\n", XML_ErrorString(code)); + gs_error = XML_ErrorString(code); return GS_INVALID; } app_list = (PAPP_LIST) query.data; diff --git a/src/main.c b/src/main.c index 6ba1e73..34abd9e 100644 --- a/src/main.c +++ b/src/main.c @@ -304,7 +304,12 @@ int main(int argc, char* argv[]) { } else if (strcmp("pair", action) == 0) { char pin[5]; 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) { pair_check(server); gs_quit_app(server);