mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-14 18:57:07 -07:00
Basic Session
This commit is contained in:
parent
ad587d5aa2
commit
a81de8f7b5
11 changed files with 445 additions and 3 deletions
19
lib/CMakeLists.txt
Normal file
19
lib/CMakeLists.txt
Normal file
|
@ -0,0 +1,19 @@
|
|||
|
||||
set(HEADER_FILES
|
||||
include/chiaki/session.h
|
||||
include/chiaki/common.h
|
||||
include/chiaki/thread.h
|
||||
include/chiaki/base64.h)
|
||||
|
||||
set(SOURCE_FILES
|
||||
src/session.c
|
||||
src/thread.c
|
||||
src/base64.c)
|
||||
|
||||
add_library(chiaki-lib ${HEADER_FILES} ${SOURCE_FILES})
|
||||
set_target_properties(chiaki-lib PROPERTIES OUTPUT_NAME chiaki)
|
||||
|
||||
target_include_directories(chiaki-lib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
|
||||
|
||||
find_package(Threads)
|
||||
target_link_libraries(chiaki-lib Threads::Threads)
|
37
lib/include/chiaki/base64.h
Normal file
37
lib/include/chiaki/base64.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* 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_BASE64_H
|
||||
#define CHIAKI_BASE64_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
CHIAKI_EXPORT bool chiaki_base64_decode(const char *in, size_t in_size, uint8_t *out, size_t *out_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // CHIAKI_BASE64_H
|
31
lib/include/chiaki/common.h
Normal file
31
lib/include/chiaki/common.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* 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_COMMON_H
|
||||
#define CHIAKI_COMMON_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CHIAKI_EXPORT
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // CHIAKI_COMMON_H
|
62
lib/include/chiaki/session.h
Normal file
62
lib/include/chiaki/session.h
Normal file
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* 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_SESSION_H
|
||||
#define CHIAKI_SESSION_H
|
||||
|
||||
#include "common.h"
|
||||
#include "thread.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct chiaki_connect_info_t
|
||||
{
|
||||
const char *host;
|
||||
const char *regist_key;
|
||||
const char *ostype;
|
||||
char auth[0x10];
|
||||
uint8_t morning[0x10];
|
||||
} ChiakiConnectInfo;
|
||||
|
||||
typedef struct chiaki_session_t
|
||||
{
|
||||
struct
|
||||
{
|
||||
char *host;
|
||||
char *regist_key;
|
||||
char *ostype;
|
||||
char auth[0x10];
|
||||
uint8_t morning[0x10];
|
||||
} connect_info;
|
||||
|
||||
ChiakiThread session_thread;
|
||||
} ChiakiSession;
|
||||
|
||||
CHIAKI_EXPORT void chiaki_session_init(ChiakiSession *session, ChiakiConnectInfo *connect_info);
|
||||
CHIAKI_EXPORT void chiaki_session_fini(ChiakiSession *session);
|
||||
CHIAKI_EXPORT bool chiaki_session_start(ChiakiSession *session);
|
||||
CHIAKI_EXPORT void chiaki_session_join(ChiakiSession *session);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // CHIAKI_SESSION_H
|
45
lib/include/chiaki/thread.h
Normal file
45
lib/include/chiaki/thread.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* 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_THREAD_H
|
||||
#define CHIAKI_THREAD_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
typedef struct chiaki_thread_t
|
||||
{
|
||||
pthread_t thread;
|
||||
} ChiakiThread;
|
||||
|
||||
typedef void *(*ChiakiThreadFunc)(void *);
|
||||
|
||||
CHIAKI_EXPORT bool chiaki_thread_create(ChiakiThread *thread, ChiakiThreadFunc func, void *arg);
|
||||
CHIAKI_EXPORT bool chiaki_thread_join(ChiakiThread *thread, void **retval);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // CHIAKI_THREAD_H
|
95
lib/src/base64.c
Normal file
95
lib/src/base64.c
Normal file
|
@ -0,0 +1,95 @@
|
|||
/*
|
||||
* 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/base64.h>
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
// Implementation taken from
|
||||
// https://en.wikibooks.org/wiki/Algorithm_Implementation/Miscellaneous/Base64
|
||||
|
||||
#define WHITESPACE 64
|
||||
#define EQUALS 65
|
||||
#define INVALID 66
|
||||
|
||||
static const unsigned char d[] = {
|
||||
66,66,66,66,66,66,66,66,66,66,64,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
|
||||
66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,62,66,66,66,63,52,53,
|
||||
54,55,56,57,58,59,60,61,66,66,66,65,66,66,66, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
|
||||
10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,66,66,66,66,66,66,26,27,28,
|
||||
29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,66,66,
|
||||
66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
|
||||
66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
|
||||
66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
|
||||
66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
|
||||
66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,
|
||||
66,66,66,66,66,66
|
||||
};
|
||||
|
||||
CHIAKI_EXPORT bool chiaki_base64_decode(const char *in, size_t in_size, uint8_t *out, size_t *out_size)
|
||||
{
|
||||
const char *end = in + in_size;
|
||||
char iter = 0;
|
||||
uint32_t buf = 0;
|
||||
size_t len = 0;
|
||||
|
||||
while (in < end)
|
||||
{
|
||||
unsigned char c = d[*in++];
|
||||
|
||||
switch(c)
|
||||
{
|
||||
case WHITESPACE:
|
||||
continue; // skip whitespace
|
||||
case INVALID:
|
||||
return false; // invalid input
|
||||
case EQUALS: // pad character, end of data
|
||||
in = end;
|
||||
continue;
|
||||
default:
|
||||
buf = buf << 6 | c;
|
||||
iter++; // increment the number of iteration
|
||||
// If the buffer is full, split it into bytes
|
||||
if(iter == 4)
|
||||
{
|
||||
if((len += 3) > *out_size)
|
||||
return false; // buffer overflow
|
||||
*(out++) = (unsigned char)((buf >> 16) & 0xff);
|
||||
*(out++) = (unsigned char)((buf >> 8) & 0xff);
|
||||
*(out++) = (unsigned char)(buf & 0xff);
|
||||
buf = 0; iter = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(iter == 3)
|
||||
{
|
||||
if((len += 2) > *out_size)
|
||||
return false; // buffer overflow
|
||||
*(out++) = (unsigned char)((buf >> 10) & 0xff);
|
||||
*(out++) = (unsigned char)((buf >> 2) & 0xff);
|
||||
}
|
||||
else if(iter == 2)
|
||||
{
|
||||
if(++len > *out_size)
|
||||
return 1; // buffer overflow
|
||||
*(out++) = (unsigned char)((buf >> 4) & 0xff);
|
||||
}
|
||||
|
||||
*out_size = len;
|
||||
return true;
|
||||
}
|
73
lib/src/session.c
Normal file
73
lib/src/session.c
Normal file
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* 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/session.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
static const char session_request[] =
|
||||
"GET /sce/rp/session HTTP/1.1\r\n"
|
||||
"Host: 192.168. 1. 8:9295\r\n"
|
||||
"User-Agent: remoteplay Windows\r\n"
|
||||
"Connection: close\r\n"
|
||||
"Content-Length: 0\r\n"
|
||||
"RP-Registkey: 3131633065363864\r\n"
|
||||
"Rp-Version: 8.0\r\n"
|
||||
"\r\n";
|
||||
|
||||
|
||||
static void *session_thread_func(void *arg);
|
||||
|
||||
|
||||
CHIAKI_EXPORT void chiaki_session_init(ChiakiSession *session, ChiakiConnectInfo *connect_info)
|
||||
{
|
||||
session->connect_info.host = strdup(connect_info->host);
|
||||
session->connect_info.regist_key = strdup(connect_info->regist_key);
|
||||
session->connect_info.ostype = strdup(connect_info->ostype);
|
||||
memcpy(session->connect_info.auth, connect_info->auth, sizeof(session->connect_info.auth));
|
||||
memcpy(session->connect_info.morning, connect_info->morning, sizeof(session->connect_info.morning));
|
||||
}
|
||||
|
||||
CHIAKI_EXPORT void chiaki_session_fini(ChiakiSession *session)
|
||||
{
|
||||
free(session->connect_info.host);
|
||||
free(session->connect_info.regist_key);
|
||||
free(session->connect_info.ostype);
|
||||
}
|
||||
|
||||
CHIAKI_EXPORT bool chiaki_session_start(ChiakiSession *session)
|
||||
{
|
||||
bool r = chiaki_thread_create(&session->session_thread, session_thread_func, session);
|
||||
if(!r)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
CHIAKI_EXPORT void chiaki_session_join(ChiakiSession *session)
|
||||
{
|
||||
chiaki_thread_join(&session->session_thread, NULL);
|
||||
}
|
||||
|
||||
static void *session_thread_func(void *arg)
|
||||
{
|
||||
ChiakiSession *session = arg;
|
||||
printf("Sleepy...\n");
|
||||
return NULL;
|
||||
}
|
43
lib/src/thread.c
Normal file
43
lib/src/thread.c
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* 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/thread.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
CHIAKI_EXPORT bool chiaki_thread_create(ChiakiThread *thread, ChiakiThreadFunc func, void *arg)
|
||||
{
|
||||
int r = pthread_create(&thread->thread, NULL, func, arg);
|
||||
if(r != 0)
|
||||
{
|
||||
perror("pthread_create");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
CHIAKI_EXPORT bool chiaki_thread_join(ChiakiThread *thread, void **retval)
|
||||
{
|
||||
int r = pthread_join(thread->thread, retval);
|
||||
if(r != 0)
|
||||
{
|
||||
perror("pthread_join");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue