Abandonment of the project
This commit is contained in:
83
base64.c
Normal file
83
base64.c
Normal file
@@ -0,0 +1,83 @@
|
||||
#include "base64.h"
|
||||
|
||||
// Thanks, ryyst https://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* Data
|
||||
*/
|
||||
static const int mod_table[] = {0, 2, 1};
|
||||
static const char *encoding_table =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
||||
static char decoding_table[256] = {};
|
||||
|
||||
/*
|
||||
* Private API
|
||||
*/
|
||||
static void build_decoding_table() {
|
||||
for (int i = 0; i < 64; ++i) {
|
||||
decoding_table[(uint8_t)encoding_table[i]] = i;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Public API
|
||||
*/
|
||||
char *base64_encode(const void *_data, uint32_t size) {
|
||||
uint32_t out_size = 4 * ((size + 2) / 3) + 1;
|
||||
char *out_data = malloc(out_size);
|
||||
if (!out_size) {
|
||||
return NULL;
|
||||
}
|
||||
const char *data = _data;
|
||||
for (int i = 0, j = 0; i < size;) {
|
||||
uint32_t octet_a = i < size ? (uint8_t)data[i++] : 0;
|
||||
uint32_t octet_b = i < size ? (uint8_t)data[i++] : 0;
|
||||
uint32_t octet_c = i < size ? (uint8_t)data[i++] : 0;
|
||||
|
||||
uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;
|
||||
|
||||
out_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F];
|
||||
out_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F];
|
||||
out_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F];
|
||||
out_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F];
|
||||
}
|
||||
for (int i = 0; i < mod_table[size % 3]; i++)
|
||||
out_data[out_size - 2 - i] = '=';
|
||||
out_data[out_size - 1] = '\0';
|
||||
return out_data;
|
||||
}
|
||||
|
||||
void *base64_decode(const char *data, uint32_t *out_size) {
|
||||
if (decoding_table[0] == 0)
|
||||
build_decoding_table();
|
||||
uint32_t size = strlen(data);
|
||||
if (size % 4 != 0) return NULL;
|
||||
|
||||
*out_size = size / 4 * 3;
|
||||
if (data[size - 1] == '=') (*out_size)--;
|
||||
if (data[size - 2] == '=') (*out_size)--;
|
||||
|
||||
uint8_t *decoded_data = malloc(*out_size);
|
||||
if (decoded_data == NULL) return NULL;
|
||||
|
||||
for (int i = 0, j = 0; i < size;) {
|
||||
uint32_t sextet_a = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
|
||||
uint32_t sextet_b = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
|
||||
uint32_t sextet_c = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
|
||||
uint32_t sextet_d = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
|
||||
|
||||
uint32_t triple = (sextet_a << 3 * 6)
|
||||
+ (sextet_b << 2 * 6)
|
||||
+ (sextet_c << 1 * 6)
|
||||
+ (sextet_d << 0 * 6);
|
||||
|
||||
if (j < *out_size) decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
|
||||
if (j < *out_size) decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
|
||||
if (j < *out_size) decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
|
||||
}
|
||||
return decoded_data;
|
||||
}
|
||||
27
base64.h
Normal file
27
base64.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef __BASE64_H
|
||||
#define __BASE64_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
* Public API
|
||||
*/
|
||||
// Encode data as URL-safe Base64.
|
||||
// Parameters:
|
||||
// - data - data to encode
|
||||
// - size - size of data to encode
|
||||
// Returns:
|
||||
// - pointer to resulting \0-terminated string (you must free() it)
|
||||
// - NULL on out-of-memory
|
||||
char *base64_encode(const void *data, uint32_t size);
|
||||
|
||||
// Decode data from URL-safe Base64.
|
||||
// Parameters:
|
||||
// - data - data to decode (must have \0)
|
||||
// - out_size - size of decoded data
|
||||
// Returns:
|
||||
// - pointer to decoded data (you must free() it)
|
||||
// - NULL on out-of-memory
|
||||
void *base64_decode(const char *data, uint32_t *out_size);
|
||||
|
||||
#endif
|
||||
2
build.sh
2
build.sh
@@ -10,4 +10,4 @@ mkdir build
|
||||
|
||||
# build
|
||||
echo "[I] Building ipoim..."
|
||||
gcc *.c $(curl-config --cflags) $(curl-config --libs) -I. -o build/ipoim
|
||||
gcc *.c mediums/*.c $(curl-config --cflags) $(curl-config --libs) -I. -o build/ipoim
|
||||
|
||||
@@ -92,6 +92,7 @@ static void _free_conn(int index) {
|
||||
c->id
|
||||
);
|
||||
}
|
||||
pm_close(c->id);
|
||||
close(c->fd);
|
||||
rb_free(c->send_buf);
|
||||
free(c);
|
||||
|
||||
23
main.c
23
main.c
@@ -14,6 +14,8 @@
|
||||
#include "event_loop.h"
|
||||
#include "server.h"
|
||||
#include "utils.h"
|
||||
#include "priv_medium.h"
|
||||
#include "medium_list.h"
|
||||
|
||||
/*
|
||||
* Data
|
||||
@@ -165,6 +167,22 @@ static void server_deinit() {
|
||||
server_close();
|
||||
}
|
||||
|
||||
// Setup the medium based on extension choice.
|
||||
static bool medium_setup() {
|
||||
const char *ext = cli_arg_get("E");
|
||||
int i = 0;
|
||||
for (;;) {
|
||||
if (strcmp(ext, MEDIUM_LIST[i])) {
|
||||
i += 2;
|
||||
continue;
|
||||
}
|
||||
((void (*)())MEDIUM_LIST[i + 1])();
|
||||
return true;
|
||||
}
|
||||
fprintf(stderr, "[!] Extension '%s' is not supported\n", ext);
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Callbacks and main
|
||||
*/
|
||||
@@ -200,6 +218,9 @@ int main(int argc, char **argv) {
|
||||
print_usage_text();
|
||||
return 1;
|
||||
}
|
||||
if (!medium_setup) {
|
||||
return 1;
|
||||
}
|
||||
if (!loop_init(on_fd_event)) {
|
||||
return 1;
|
||||
}
|
||||
@@ -221,6 +242,7 @@ int main(int argc, char **argv) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
pm_init();
|
||||
// Loop
|
||||
while (_to_work) {
|
||||
if (!loop_wait()) {
|
||||
@@ -230,6 +252,7 @@ int main(int argc, char **argv) {
|
||||
fprintf(stderr, "--- loop ---\n");
|
||||
}
|
||||
// Termination
|
||||
pm_deinit();
|
||||
if (_is_server) {
|
||||
server_close();
|
||||
}
|
||||
|
||||
41
medium.c
Normal file
41
medium.c
Normal file
@@ -0,0 +1,41 @@
|
||||
#include "medium.h"
|
||||
|
||||
#include "event_loop.h"
|
||||
#include "priv_medium.h"
|
||||
|
||||
/*
|
||||
* Public API
|
||||
*/
|
||||
void medium_set_callbacks(
|
||||
cbmed_on_init_t on_init,
|
||||
cbmed_on_deinit_t on_deinit,
|
||||
cbmed_on_timer_t on_timer,
|
||||
cbmed_on_fd_event_t on_fd_event,
|
||||
cbmed_on_send_data_t on_send_data
|
||||
) {
|
||||
pm_on_init = on_init;
|
||||
pm_on_deinit = on_deinit;
|
||||
pm_on_timer = on_timer;
|
||||
pm_on_fd_event = on_fd_event;
|
||||
pm_on_send_data = on_send_data;
|
||||
}
|
||||
|
||||
void medium_epoll_ctl(int op, int fd, struct epoll_event *ev) {
|
||||
loop_ctl(op, fd, ev);
|
||||
}
|
||||
|
||||
void medium_on_recv_data(const void *data, int32_t size) {
|
||||
|
||||
}
|
||||
|
||||
void medium_set_ready_to_send(bool state) {
|
||||
|
||||
}
|
||||
|
||||
void medium_set_max_send_size(int32_t size) {
|
||||
|
||||
}
|
||||
|
||||
void medium_start_timer(uint32_t id, int32_t ms) {
|
||||
|
||||
}
|
||||
57
medium.h
Normal file
57
medium.h
Normal file
@@ -0,0 +1,57 @@
|
||||
#ifndef __MEDIUM_H
|
||||
#define __MEDIUM_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <sys/epoll.h>
|
||||
|
||||
/*
|
||||
* Type definitions
|
||||
*/
|
||||
typedef bool (*cbmed_on_init_t)();
|
||||
typedef void (*cbmed_on_deinit_t)();
|
||||
typedef void (*cbmed_on_timer_t)(uint32_t id);
|
||||
typedef void (*cbmed_on_fd_event_t)(int fd, uint32_t events);
|
||||
typedef int32_t (*cbmed_on_send_data_t)(const void *data, int32_t size);
|
||||
|
||||
/*
|
||||
* Public API
|
||||
*/
|
||||
// Set callbacks to use to utilize medium.
|
||||
void medium_set_callbacks(
|
||||
cbmed_on_init_t on_init,
|
||||
cbmed_on_deinit_t on_deinit,
|
||||
cbmed_on_timer_t on_timer,
|
||||
cbmed_on_fd_event_t on_fd_event,
|
||||
cbmed_on_send_data_t on_send_data
|
||||
);
|
||||
|
||||
// Modify epoll.
|
||||
// Remarks:
|
||||
// - see `man epoll_ctl`
|
||||
void medium_epoll_ctl(int op, int fd, struct epoll_event *ev);
|
||||
|
||||
// Use this when you have received data from medium.
|
||||
// Parameters:
|
||||
// - data - data you received
|
||||
// - size - size of data
|
||||
void medium_on_recv_data(const void *data, int32_t size);
|
||||
|
||||
// Call when you become ready/not ready to send data.
|
||||
// Parameters:
|
||||
// - state - true = ready; false = not ready
|
||||
void medium_set_ready_to_send(bool state);
|
||||
|
||||
// Set max size of data you are ready to accept for sending.
|
||||
// Parameters:
|
||||
// - size - size of data
|
||||
void medium_set_max_send_size(int32_t size);
|
||||
|
||||
// Start timer.
|
||||
// Parameters:
|
||||
// - id - timer ID
|
||||
// - ms - milliseconds to wait
|
||||
void medium_start_timer(uint32_t id, int32_t ms);
|
||||
|
||||
#endif
|
||||
13
medium_list.h
Normal file
13
medium_list.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#ifndef __MEDIUM_LIST_H
|
||||
#define __MEDIUM_LIST_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "mediums/medium_pipe.h"
|
||||
|
||||
static const void *MEDIUM_LIST[] = {
|
||||
"pipe", medium_pipe_setup_callbacks,
|
||||
NULL
|
||||
};
|
||||
|
||||
#endif
|
||||
40
mediums/medium_pipe.c
Normal file
40
mediums/medium_pipe.c
Normal file
@@ -0,0 +1,40 @@
|
||||
#include "medium_pipe.h"
|
||||
|
||||
#include "base64.h"
|
||||
#include "medium.h"
|
||||
#include "utils.h"
|
||||
|
||||
/*
|
||||
* Private API
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Callbacks
|
||||
*/
|
||||
static bool cbmed_on_init() {
|
||||
return true;
|
||||
}
|
||||
|
||||
static void cbmed_on_deinit() {
|
||||
|
||||
}
|
||||
|
||||
static void cbmed_on_timer(uint32_t id) {
|
||||
|
||||
}
|
||||
|
||||
static void cbmed_on_fd_event(int fd, uint32_t events) {
|
||||
|
||||
}
|
||||
|
||||
static int32_t cbmed_on_send_data(const void *data, int32_t size) {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Public API
|
||||
*/
|
||||
void medium_pipe_setup_callbacks() {
|
||||
|
||||
}
|
||||
9
mediums/medium_pipe.h
Normal file
9
mediums/medium_pipe.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef __MEDIUM_PIPE_H
|
||||
#define __MEDIUM_PIPE_H
|
||||
|
||||
/*
|
||||
* Public API
|
||||
*/
|
||||
void medium_pipe_setup_callbacks();
|
||||
|
||||
#endif
|
||||
58
priv_medium.c
Normal file
58
priv_medium.c
Normal file
@@ -0,0 +1,58 @@
|
||||
#include "priv_medium.h"
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "ring_buffer.h"
|
||||
|
||||
|
||||
/*
|
||||
* Macros
|
||||
*/
|
||||
#define SEND_BUF_SIZE (5 * 1024 * 1024)
|
||||
|
||||
/*
|
||||
* Private data
|
||||
*/
|
||||
static rb_handle_t send_buf = NULL;
|
||||
|
||||
/*
|
||||
* Public data
|
||||
*/
|
||||
cbmed_on_init_t pm_on_init = NULL;
|
||||
cbmed_on_deinit_t pm_on_deinit = NULL;
|
||||
cbmed_on_timer_t pm_on_timer = NULL;
|
||||
cbmed_on_fd_event_t pm_on_fd_event = NULL;
|
||||
cbmed_on_send_data_t pm_on_send_data = NULL;
|
||||
|
||||
/*
|
||||
* Private API
|
||||
*/
|
||||
static void _send_data(const void *data, uint32_t size) {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Public API
|
||||
*/
|
||||
bool pm_init() {
|
||||
send_buf = rb_allocate(SEND_BUF_SIZE);
|
||||
pm_on_init();
|
||||
}
|
||||
|
||||
void pm_deinit() {
|
||||
pm_on_deinit();
|
||||
rb_free(send_buf);
|
||||
}
|
||||
|
||||
void pm_send(uint32_t id, const void *data, uint32_t size) {
|
||||
|
||||
}
|
||||
|
||||
void pm_connect(uint32_t id) {
|
||||
|
||||
}
|
||||
|
||||
void pm_close(uint32_t id) {
|
||||
|
||||
}
|
||||
48
priv_medium.h
Normal file
48
priv_medium.h
Normal file
@@ -0,0 +1,48 @@
|
||||
#ifndef __PRIV_MEDIUM_H
|
||||
#define __PRIV_MEDIUM_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "medium.h"
|
||||
|
||||
/*
|
||||
* Public data
|
||||
*/
|
||||
extern cbmed_on_init_t pm_on_init;
|
||||
extern cbmed_on_deinit_t pm_on_deinit;
|
||||
extern cbmed_on_timer_t pm_on_timer;
|
||||
extern cbmed_on_fd_event_t pm_on_fd_event;
|
||||
extern cbmed_on_send_data_t pm_on_send_data;
|
||||
|
||||
/*
|
||||
* Public API
|
||||
*/
|
||||
// Initialize medium.
|
||||
// Returns:
|
||||
// - true on success
|
||||
// Remarks:
|
||||
// - you must call medium_<name>_setup_callbacks() before this
|
||||
bool pm_init();
|
||||
|
||||
// Deinitialize medium.
|
||||
void pm_deinit();
|
||||
|
||||
// Transmit data.
|
||||
// Parameters:
|
||||
// - id - connection ID
|
||||
// - data - data to send (copied)
|
||||
// - size - size of data
|
||||
void pm_send(uint32_t id, const void *data, uint32_t size);
|
||||
|
||||
// Send PT_CONNECT.
|
||||
// Parameters:
|
||||
// - id - connection ID
|
||||
void pm_connect(uint32_t id);
|
||||
|
||||
// Send PT_CLOSE.
|
||||
// Parameters:
|
||||
// - id - connection ID
|
||||
void pm_close(uint32_t id);
|
||||
|
||||
#endif
|
||||
4
server.c
4
server.c
@@ -10,6 +10,7 @@
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "priv_medium.h"
|
||||
#include "connection.h"
|
||||
#include "utils.h"
|
||||
|
||||
@@ -39,8 +40,7 @@ bool _accept() {
|
||||
// no returning false, because it would terminate the app
|
||||
}
|
||||
else {
|
||||
const char* data = "Test data lalalala";
|
||||
connection_send(id, data, strlen(data));
|
||||
pm_connect(id);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user