Libgamestream doesn't print to console

This commit is contained in:
Iwan Timmer 2015-07-23 13:06:47 +02:00
parent 06265eddad
commit 6c087f40dc
6 changed files with 37 additions and 63 deletions

View File

@ -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;
}

View File

@ -17,6 +17,8 @@
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
*/
#include "errors.h"
#include <avahi-client/client.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) {
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;
}

View File

@ -25,3 +25,5 @@
#define GS_INVALID -3
#define GS_WRONG_STATE -4
#define GS_IO_ERROR -5
const char* gs_error;

View File

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

View File

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

View File

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