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);