mirror of
https://github.com/AlexAltea/orbital.git
synced 2025-04-02 10:32:05 -04:00
111 lines
2.4 KiB
C
111 lines
2.4 KiB
C
/**
|
|
* (c) 2017-2018 Alexandro Sanchez Bach.
|
|
* Released under MIT license. Read LICENSE for more details.
|
|
*/
|
|
|
|
#include "blob.h"
|
|
|
|
#include "ksdk.h"
|
|
#include "md5.h"
|
|
#include "debug.h"
|
|
|
|
#define BLOBS_ADDR IP(192,168,2,1);
|
|
#define BLOBS_PORT 9021
|
|
|
|
int blobs_sockfd = 0;
|
|
|
|
/* blobs */
|
|
blob_t* blob_add(blob_t *blob)
|
|
{
|
|
blob_t *next = malloc(sizeof(blob_t));
|
|
memset(next, 0, sizeof(blob_t));
|
|
blob->next = next;
|
|
return next;
|
|
}
|
|
|
|
void blob_set_path(blob_t *blob, const char *path)
|
|
{
|
|
blob->path = strdup(path);
|
|
}
|
|
|
|
void blob_set_path_hash(blob_t *blob, const uint8_t *data, size_t size)
|
|
{
|
|
uint8_t hash[16];
|
|
char path[256];
|
|
char *p;
|
|
|
|
MD5_CTX ctx;
|
|
MD5_Init(&ctx);
|
|
MD5_Update(&ctx, data, size);
|
|
MD5_Final(hash, &ctx);
|
|
|
|
strncpy(path, "crypto/", sizeof(path));
|
|
p = strrchr(path, '/') + 1;
|
|
for (size_t i = 0; i < sizeof(hash); i++) {
|
|
snprintf(p, 3, "%02X", hash[i]);
|
|
p += 2;
|
|
}
|
|
strncpy(p, ".bin", sizeof(path) - (p - &path[0]));
|
|
blob_set_path(blob, path);
|
|
}
|
|
|
|
void blob_transfer_init()
|
|
{
|
|
struct sockaddr_in server;
|
|
memset(&server, 0, sizeof(server));
|
|
server.sin_len = sizeof(server);
|
|
server.sin_family = AF_INET;
|
|
server.sin_addr.s_addr = BLOBS_ADDR;
|
|
server.sin_port = sceNetHtons(BLOBS_PORT);
|
|
|
|
blobs_sockfd = sceNetSocket("blobs", AF_INET, SOCK_STREAM, 0);
|
|
sceNetConnect(blobs_sockfd, (struct sockaddr *)&server, sizeof(server));
|
|
}
|
|
|
|
void blob_transfer_close()
|
|
{
|
|
sceNetSocketClose(blobs_sockfd);
|
|
}
|
|
|
|
static void blob_transfer_via_net(blob_t *blob)
|
|
{
|
|
size_t path_size;
|
|
|
|
path_size = strlen(blob->path);
|
|
sceNetSend(blobs_sockfd, &path_size, sizeof(path_size), 0);
|
|
sceNetSend(blobs_sockfd, &blob->path[0], path_size, 0);
|
|
sceNetSend(blobs_sockfd, &blob->size, sizeof(blob->size), 0);
|
|
sceNetSend(blobs_sockfd, &blob->data[0], blob->size, 0);
|
|
}
|
|
|
|
static void blob_transfer_via_usb(blob_t *blob)
|
|
{
|
|
dprintf("Unimplemented\n");
|
|
}
|
|
|
|
void blob_transfer(blob_t *blob, int mode)
|
|
{
|
|
if (!blob) {
|
|
return;
|
|
}
|
|
switch (mode) {
|
|
case BLOB_TRANSFER_NET:
|
|
blob_transfer_via_net(blob);
|
|
break;
|
|
case BLOB_TRANSFER_USB:
|
|
blob_transfer_via_usb(blob);
|
|
break;
|
|
default:
|
|
dprintf("Unimplemented\n");
|
|
}
|
|
}
|
|
|
|
void blob_transfer_all(blob_t *blobs, int mode)
|
|
{
|
|
while (blobs) {
|
|
if (blobs->data) {
|
|
blob_transfer(blobs, mode);
|
|
}
|
|
blobs = blobs->next;
|
|
}
|
|
}
|