This commit is contained in:
Florian Märkl 2018-11-16 21:55:32 +01:00
commit 5d5fd32fe6
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
5 changed files with 123 additions and 8 deletions

View file

@ -4,14 +4,16 @@ set(HEADER_FILES
include/chiaki/common.h include/chiaki/common.h
include/chiaki/thread.h include/chiaki/thread.h
include/chiaki/base64.h include/chiaki/base64.h
include/chiaki/http.h) include/chiaki/http.h
include/chiaki/log.h)
set(SOURCE_FILES set(SOURCE_FILES
src/common.c src/common.c
src/session.c src/session.c
src/thread.c src/thread.c
src/base64.c src/base64.c
src/http.c) src/http.c
src/log.c)
add_library(chiaki-lib ${HEADER_FILES} ${SOURCE_FILES}) add_library(chiaki-lib ${HEADER_FILES} ${SOURCE_FILES})
set_target_properties(chiaki-lib PROPERTIES OUTPUT_NAME chiaki) set_target_properties(chiaki-lib PROPERTIES OUTPUT_NAME chiaki)

47
lib/include/chiaki/log.h Normal file
View file

@ -0,0 +1,47 @@
/*
* This file is part of Chiaki.
*
* Chiaki is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Chiaki is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Chiaki. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef CHIAKI_LOG_H
#define CHIAKI_LOG_H
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
CHIAKI_LOG_DEBUG,
CHIAKI_LOG_INFO,
CHIAKI_LOG_WARNING,
CHIAKI_LOG_ERROR
} ChiakiLogLevel;
typedef struct chiaki_log_t
{
} ChiakiLog;
void chiaki_log(ChiakiLog *log, ChiakiLogLevel level, const char *fmt, ...);
#define CHIAKI_LOGD(log, ...) do { chiaki_log((log), CHIAKI_LOG_DEBUG, __VA_ARGS__); } while(0);
#define CHIAKI_LOGI(log, ...) do { chiaki_log((log), CHIAKI_LOG_INFO, __VA_ARGS__); } while(0);
#define CHIAKI_LOGW(log, ...) do { chiaki_log((log), CHIAKI_LOG_WARNING, __VA_ARGS__); } while(0);
#define CHIAKI_LOGE(log, ...) do { chiaki_log((log), CHIAKI_LOG_ERROR, __VA_ARGS__); } while(0);
#ifdef __cplusplus
}
#endif
#endif // CHIAKI_LOG_H

View file

@ -20,6 +20,7 @@
#include "common.h" #include "common.h"
#include "thread.h" #include "thread.h"
#include "log.h"
#include <stdint.h> #include <stdint.h>
#include <netdb.h> #include <netdb.h>
@ -88,6 +89,8 @@ typedef struct chiaki_session_t
void *event_cb_user; void *event_cb_user;
ChiakiThread session_thread; ChiakiThread session_thread;
ChiakiLog log;
} ChiakiSession; } ChiakiSession;
CHIAKI_EXPORT ChiakiErrorCode chiaki_session_init(ChiakiSession *session, ChiakiConnectInfo *connect_info); CHIAKI_EXPORT ChiakiErrorCode chiaki_session_init(ChiakiSession *session, ChiakiConnectInfo *connect_info);

52
lib/src/log.c Normal file
View file

@ -0,0 +1,52 @@
/*
* This file is part of Chiaki.
*
* Chiaki is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Chiaki is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Chiaki. If not, see <https://www.gnu.org/licenses/>.
*/
#include <chiaki/log.h>
#include <stdio.h>
#include <stdarg.h>
void chiaki_log(ChiakiLog *log, ChiakiLogLevel level, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
char c;
switch(level)
{
case CHIAKI_LOG_DEBUG:
c = 'D';
break;
case CHIAKI_LOG_INFO:
c = 'I';
break;
case CHIAKI_LOG_WARNING:
c = 'W';
break;
case CHIAKI_LOG_ERROR:
c = 'E';
break;
default:
c = '?';
break;
}
printf("[%c] ", c);
vprintf(fmt, args);
va_end(args);
}

View file

@ -106,11 +106,13 @@ static void *session_thread_func(void *arg)
ChiakiSession *session = arg; ChiakiSession *session = arg;
bool success; bool success;
CHIAKI_LOGI(&session->log, "Starting session request\n");
success = session_thread_request_session(session); success = session_thread_request_session(session);
if(!success) if(!success)
goto quit; goto quit;
printf("Connected!\n"); CHIAKI_LOGI(&session->log, "Session request successful\n");
ChiakiEvent quit_event; ChiakiEvent quit_event;
quit: quit:
@ -188,13 +190,17 @@ static bool session_thread_request_session(ChiakiSession *session)
continue; continue;
} }
CHIAKI_LOGI(&session->log, "Trying to request session from %s:%d\n", host_buf, SESSION_PORT);
session_sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); session_sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
if(session_sock < 0) if(session_sock < 0)
continue; continue;
r = connect(session_sock, sa, ai->ai_addrlen); r = connect(session_sock, sa, ai->ai_addrlen);
if(r < 0) if(r < 0)
{ {
if(errno == ECONNREFUSED) int errsv = errno;
CHIAKI_LOGE(&session->log, "Session request connect failed: %s\n", strerror(errsv));
if(errsv == ECONNREFUSED)
session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_CONNECTION_REFUSED; session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_CONNECTION_REFUSED;
else else
session->quit_reason = CHIAKI_QUIT_REASON_NONE; session->quit_reason = CHIAKI_QUIT_REASON_NONE;
@ -212,13 +218,13 @@ static bool session_thread_request_session(ChiakiSession *session)
if(session_sock < 0) if(session_sock < 0)
{ {
printf("Session Connection Failed.\n"); CHIAKI_LOGE(&session->log, "Session request connect failed eventually.\n");
if(session->quit_reason == CHIAKI_QUIT_REASON_NONE) if(session->quit_reason == CHIAKI_QUIT_REASON_NONE)
session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN;
return false; return false;
} }
printf("Connected to %s:%u\n", host_buf, SESSION_PORT); CHIAKI_LOGI(&session->log, "Connected to %s:%d\n", host_buf, SESSION_PORT);
static const char session_request_fmt[] = static const char session_request_fmt[] =
"GET /sce/rp/session HTTP/1.1\r\n" "GET /sce/rp/session HTTP/1.1\r\n"
@ -240,11 +246,12 @@ static bool session_thread_request_session(ChiakiSession *session)
return false; return false;
} }
printf("sending\n%s\n", buf); CHIAKI_LOGI(&session->log, "Sending session request\n");
ssize_t sent = send(session_sock, buf, (size_t)request_len, 0); ssize_t sent = send(session_sock, buf, (size_t)request_len, 0);
if(sent < 0) if(sent < 0)
{ {
CHIAKI_LOGE(&session->log, "Failed to send session request\n");
close(session_sock); close(session_sock);
session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN;
return false; return false;
@ -255,18 +262,19 @@ static bool session_thread_request_session(ChiakiSession *session)
ChiakiErrorCode err = chiaki_recv_http_header(session_sock, buf, sizeof(buf), &header_size, &received_size); ChiakiErrorCode err = chiaki_recv_http_header(session_sock, buf, sizeof(buf), &header_size, &received_size);
if(err != CHIAKI_ERR_SUCCESS) if(err != CHIAKI_ERR_SUCCESS)
{ {
CHIAKI_LOGE(&session->log, "Failed to receive session request response\n");
close(session_sock); close(session_sock);
session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN;
return false; return false;
} }
buf[received_size] = '\0'; buf[received_size] = '\0';
printf("received\n%s\n", buf);
ChiakiHttpResponse http_response; ChiakiHttpResponse http_response;
err = chiaki_http_response_parse(&http_response, buf, header_size); err = chiaki_http_response_parse(&http_response, buf, header_size);
if(err != CHIAKI_ERR_SUCCESS) if(err != CHIAKI_ERR_SUCCESS)
{ {
CHIAKI_LOGE(&session->log, "Failed to parse session request response\n");
close(session_sock); close(session_sock);
session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN;
return false; return false;
@ -281,6 +289,7 @@ static bool session_thread_request_session(ChiakiSession *session)
err = chiaki_base64_decode(response.nonce, strlen(response.nonce), session->nonce, &nonce_len); err = chiaki_base64_decode(response.nonce, strlen(response.nonce), session->nonce, &nonce_len);
if(err != CHIAKI_ERR_SUCCESS || nonce_len != CHIAKI_KEY_BYTES) if(err != CHIAKI_ERR_SUCCESS || nonce_len != CHIAKI_KEY_BYTES)
{ {
CHIAKI_LOGE(&session->log, "Nonce invalid\n");
response.success = false; response.success = false;
session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN;
} }
@ -290,9 +299,11 @@ static bool session_thread_request_session(ChiakiSession *session)
switch(response.error_code) switch(response.error_code)
{ {
case RP_APPLICATION_REASON_IN_USE: case RP_APPLICATION_REASON_IN_USE:
CHIAKI_LOGE(&session->log, "Remote is already in use\n");
session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_IN_USE; session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_IN_USE;
break; break;
case RP_APPLICATION_REASON_CRASH: case RP_APPLICATION_REASON_CRASH:
CHIAKI_LOGE(&session->log, "Remote seems to have crashed\n");
session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_CRASH; session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_CRASH;
break; break;
default: default: