forked from KolibriOS/kolibrios
Remove broken unused and unfinished apps and libs
- TEAtool: A useless utility for encryption with the TEA algorithm, written for fun by me during my school years; - GameHack: not a working prototype of a program like Cheat Engine; - microtar: port of a portable library with a reduced functionality for working with TAR in C that is not used Signed-off-by: Max Logaev <maxlogaev@proton.me>
This commit is contained in:
@@ -735,7 +735,6 @@ tup.append_table(extra_files, {
|
|||||||
{"kolibrios/develop/TinyBasic/TinyBasic", VAR_PROGS .. "/develop/tinybasic-1.0.4/tinybasic"},
|
{"kolibrios/develop/TinyBasic/TinyBasic", VAR_PROGS .. "/develop/tinybasic-1.0.4/tinybasic"},
|
||||||
{"kolibrios/develop/TinyBasic/bas/", SRC_PROGS .. "/develop/tinybasic-1.0.4/bas/*"},
|
{"kolibrios/develop/TinyBasic/bas/", SRC_PROGS .. "/develop/tinybasic-1.0.4/bas/*"},
|
||||||
{"kolibrios/develop/TinyBasic/TinyBasic.man", SRC_PROGS .. "/develop/tinybasic-1.0.4/doc/tinybasic.man"},
|
{"kolibrios/develop/TinyBasic/TinyBasic.man", SRC_PROGS .. "/develop/tinybasic-1.0.4/doc/tinybasic.man"},
|
||||||
-- {"kolibrios/utils/teatool", VAR_PROGS .. "/other/TEAtool/teatool"},
|
|
||||||
{"kolibrios/utils/passwordgen", VAR_PROGS .. "/other/PasswordGen/passwordgen"},
|
{"kolibrios/utils/passwordgen", VAR_PROGS .. "/other/PasswordGen/passwordgen"},
|
||||||
{"kolibrios/utils/kruler", VAR_PROGS .. "/other/kruler/kruler"},
|
{"kolibrios/utils/kruler", VAR_PROGS .. "/other/kruler/kruler"},
|
||||||
{"kolibrios/media/qr_tool", SRC_PROGS .. "/media/qr_tool/qr_tool"},
|
{"kolibrios/media/qr_tool", SRC_PROGS .. "/media/qr_tool/qr_tool"},
|
||||||
@@ -759,7 +758,6 @@ tup.append_table(img_files, {
|
|||||||
{"GAMES/REVERSI", VAR_PROGS .. "/games/reversi/reversi"},
|
{"GAMES/REVERSI", VAR_PROGS .. "/games/reversi/reversi"},
|
||||||
{"LIB/BASE64.OBJ", VAR_PROGS .. "/develop/libraries/base64/base64.obj"},
|
{"LIB/BASE64.OBJ", VAR_PROGS .. "/develop/libraries/base64/base64.obj"},
|
||||||
{"LIB/ICONV.OBJ", VAR_PROGS .. "/develop/libraries/iconv/iconv.obj"},
|
{"LIB/ICONV.OBJ", VAR_PROGS .. "/develop/libraries/iconv/iconv.obj"},
|
||||||
-- {"LIB/MTAR.OBJ", VAR_PROGS .. "/develop/libraries/microtar/mtar.obj"},
|
|
||||||
})
|
})
|
||||||
tup.append_table(extra_files, {
|
tup.append_table(extra_files, {
|
||||||
-- {"kolibrios/3D/cubeline", VAR_PROGS .. "/demos/cubeline/trunk/cubeline"},
|
-- {"kolibrios/3D/cubeline", VAR_PROGS .. "/demos/cubeline/trunk/cubeline"},
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
Copyright (c) 2017 rxi
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
# microtar
|
|
||||||
A lightweight tar library written in ANSI C
|
|
||||||
|
|
||||||
|
|
||||||
## Basic Usage
|
|
||||||
The library consists of `microtar.c` and `microtar.h`. These two files can be
|
|
||||||
dropped into an existing project and compiled along with it.
|
|
||||||
|
|
||||||
|
|
||||||
#### Reading
|
|
||||||
```c
|
|
||||||
mtar_t tar;
|
|
||||||
mtar_header_t h;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
/* Open archive for reading */
|
|
||||||
mtar_open(&tar, "test.tar", "r");
|
|
||||||
|
|
||||||
/* Print all file names and sizes */
|
|
||||||
while ( (mtar_read_header(&tar, &h)) != MTAR_ENULLRECORD ) {
|
|
||||||
printf("%s (%d bytes)\n", h.name, h.size);
|
|
||||||
mtar_next(&tar);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Load and print contents of file "test.txt" */
|
|
||||||
mtar_find(&tar, "test.txt", &h);
|
|
||||||
p = calloc(1, h.size + 1);
|
|
||||||
mtar_read_data(&tar, p, h.size);
|
|
||||||
printf("%s", p);
|
|
||||||
free(p);
|
|
||||||
|
|
||||||
/* Close archive */
|
|
||||||
mtar_close(&tar);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Writing
|
|
||||||
```c
|
|
||||||
mtar_t tar;
|
|
||||||
const char *str1 = "Hello world";
|
|
||||||
const char *str2 = "Goodbye world";
|
|
||||||
|
|
||||||
/* Open archive for writing */
|
|
||||||
mtar_open(&tar, "test.tar", "w");
|
|
||||||
|
|
||||||
/* Write strings to files `test1.txt` and `test2.txt` */
|
|
||||||
mtar_write_file_header(&tar, "test1.txt", strlen(str1));
|
|
||||||
mtar_write_data(&tar, str1, strlen(str1));
|
|
||||||
mtar_write_file_header(&tar, "test2.txt", strlen(str2));
|
|
||||||
mtar_write_data(&tar, str2, strlen(str2));
|
|
||||||
|
|
||||||
/* Finalize -- this needs to be the last thing done before closing */
|
|
||||||
mtar_finalize(&tar);
|
|
||||||
|
|
||||||
/* Close archive */
|
|
||||||
mtar_close(&tar);
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Error handling
|
|
||||||
All functions which return an `int` will return `MTAR_ESUCCESS` if the operation
|
|
||||||
is successful. If an error occurs an error value less-than-zero will be
|
|
||||||
returned; this value can be passed to the function `mtar_strerror()` to get its
|
|
||||||
corresponding error string.
|
|
||||||
|
|
||||||
|
|
||||||
## Wrapping a stream
|
|
||||||
If you want to read or write from something other than a file, the `mtar_t`
|
|
||||||
struct can be manually initialized with your own callback functions and a
|
|
||||||
`stream` pointer.
|
|
||||||
|
|
||||||
All callback functions are passed a pointer to the `mtar_t` struct as their
|
|
||||||
first argument. They should return `MTAR_ESUCCESS` if the operation succeeds
|
|
||||||
without an error, or an integer below zero if an error occurs.
|
|
||||||
|
|
||||||
After the `stream` field has been set, all required callbacks have been set and
|
|
||||||
all unused fields have been zeroset the `mtar_t` struct can be safely used with
|
|
||||||
the microtar functions. `mtar_open` *should not* be called if the `mtar_t`
|
|
||||||
struct was initialized manually.
|
|
||||||
|
|
||||||
#### Reading
|
|
||||||
The following callbacks should be set for reading an archive from a stream:
|
|
||||||
|
|
||||||
Name | Arguments | Description
|
|
||||||
--------|------------------------------------------|---------------------------
|
|
||||||
`read` | `mtar_t *tar, void *data, unsigned size` | Read data from the stream
|
|
||||||
`seek` | `mtar_t *tar, unsigned pos` | Set the position indicator
|
|
||||||
`close` | `mtar_t *tar` | Close the stream
|
|
||||||
|
|
||||||
#### Writing
|
|
||||||
The following callbacks should be set for writing an archive to a stream:
|
|
||||||
|
|
||||||
Name | Arguments | Description
|
|
||||||
--------|------------------------------------------------|---------------------
|
|
||||||
`write` | `mtar_t *tar, const void *data, unsigned size` | Write data to the stream
|
|
||||||
|
|
||||||
|
|
||||||
## License
|
|
||||||
This library is free software; you can redistribute it and/or modify it under
|
|
||||||
the terms of the MIT license. See [LICENSE](LICENSE) for details.
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
if tup.getconfig("NO_GCC") ~= "" then return end
|
|
||||||
HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../../../" or tup.getconfig("HELPERDIR")
|
|
||||||
tup.include(HELPERDIR .. "/use_gcc.lua")
|
|
||||||
|
|
||||||
CFLAGS = " -c -w -nostdinc -DGNUC -DMTAR_OBJ -Os -fno-common -fno-builtin -fno-leading-underscore -fno-pie"
|
|
||||||
INCLUDES = " -I../include -I../../ktcc/trunk/libc.obj/include"
|
|
||||||
|
|
||||||
tup.rule("microtar.c", "kos32-gcc" .. CFLAGS .. INCLUDES .. " -o %o %f " .. tup.getconfig("KPACK_CMD"), "mtar.obj")
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
format binary as "kex"
|
|
||||||
|
|
||||||
use32
|
|
||||||
org 0x0
|
|
||||||
db 'MENUET01'
|
|
||||||
dd 0x01
|
|
||||||
dd START
|
|
||||||
dd IM_END
|
|
||||||
dd MEM
|
|
||||||
dd MEM
|
|
||||||
dd 0
|
|
||||||
dd 0
|
|
||||||
|
|
||||||
include '../../../../macros.inc'
|
|
||||||
include '../../../../proc32.inc'
|
|
||||||
include '../../../../KOSfuncs.inc'
|
|
||||||
include '../../../../dll.inc'
|
|
||||||
include '../mtar.inc'
|
|
||||||
;include '../../../../debug-fdo.inc'
|
|
||||||
|
|
||||||
;__DEBUG__ = 1
|
|
||||||
;__DEBUG_LEVEL__ = 2
|
|
||||||
|
|
||||||
|
|
||||||
START:
|
|
||||||
stdcall dll.Load, @IMPORT ; Имортироуем функции из mtar.obj
|
|
||||||
test eax, eax
|
|
||||||
jnz exit
|
|
||||||
|
|
||||||
ccall [mtar_init] ; Инициализируем библиотеку (на самом деле подгружается libc.obj
|
|
||||||
ccall [mtar_open], tar, tar_fname, tar_fmode ; Открываем для чтения файл 'test.tar'
|
|
||||||
|
|
||||||
; DEBUGF 2, "%d", eax
|
|
||||||
|
|
||||||
print_next:
|
|
||||||
ccall [mtar_read_header], tar, header ; Читаем заголовок
|
|
||||||
cmp eax, MTAR_ENULLRECORD ; Если заголовок не был прочитан (return -7) выходим из цикла
|
|
||||||
je exit
|
|
||||||
ccall [printf], format_str, header+mtar_header_t.name, dword[header+mtar_header_t.size] ; Выводим в консоль имя файла и размер в байтах
|
|
||||||
ccall [mtar_next], tar ; Переходим к следующему заголовку
|
|
||||||
jmp print_next ; прыгаем в начало цикла
|
|
||||||
|
|
||||||
exit:
|
|
||||||
ccall [mtar_close], tar ; Закрываем 'test.tar'
|
|
||||||
mcall SF_TERMINATE_PROCESS ; Выходим из программы
|
|
||||||
|
|
||||||
; data
|
|
||||||
|
|
||||||
tar_fname db 'test.tar', 0
|
|
||||||
tar_fmode db 'r', 0
|
|
||||||
|
|
||||||
tar rb sizeof.mtar_t
|
|
||||||
header rb sizeof.mtar_header_t
|
|
||||||
|
|
||||||
format_str db '%-10s (%-4d bytes)', 0x0A,0
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
@IMPORT:
|
|
||||||
library mtar, 'mtar.obj', libc , 'libc.obj'
|
|
||||||
import mtar, \
|
|
||||||
mtar_init, 'mtar_init', \
|
|
||||||
mtar_open, 'mtar_open', \
|
|
||||||
mtar_next, 'mtar_next', \
|
|
||||||
mtar_strerror, 'mtar_strerror', \
|
|
||||||
mtar_read_header, 'mtar_read_header', \
|
|
||||||
mtar_write_data, 'mtar_write_data', \
|
|
||||||
mtar_finalize, 'mtar_finalize', \
|
|
||||||
mtar_close, 'mtar_close'
|
|
||||||
|
|
||||||
import libc, \
|
|
||||||
printf, 'printf'
|
|
||||||
|
|
||||||
|
|
||||||
IM_END:
|
|
||||||
align 4
|
|
||||||
rb 4096 ; stack
|
|
||||||
MEM:
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
format binary as "kex"
|
|
||||||
|
|
||||||
use32
|
|
||||||
org 0x0
|
|
||||||
db 'MENUET01'
|
|
||||||
dd 0x01
|
|
||||||
dd START
|
|
||||||
dd IM_END
|
|
||||||
dd MEM
|
|
||||||
dd MEM
|
|
||||||
dd 0
|
|
||||||
dd 0
|
|
||||||
|
|
||||||
include '../../../../macros.inc'
|
|
||||||
include '../../../../proc32.inc'
|
|
||||||
include '../../../../KOSfuncs.inc'
|
|
||||||
include '../../../../dll.inc'
|
|
||||||
include '../mtar.inc'
|
|
||||||
;include '../../../../debug-fdo.inc'
|
|
||||||
|
|
||||||
;__DEBUG__ = 1
|
|
||||||
;__DEBUG_LEVEL__ = 2
|
|
||||||
|
|
||||||
START:
|
|
||||||
stdcall dll.Load, @IMPORT ; Имортироуем функции из mtar.obj
|
|
||||||
test eax, eax
|
|
||||||
jnz exit
|
|
||||||
|
|
||||||
ccall [mtar_init] ; Инициализируем библиотеку (на самом деле подгружается libc.obj
|
|
||||||
ccall [mtar_open], tar, tar_fname, tar_fmode ; Создаём новый файл 'test.tar'
|
|
||||||
ccall [mtar_write_file_header], tar, test1_txt , str1_len ; Создаём внутри 'test.tar' пустрой файл 'test1.txt'
|
|
||||||
|
|
||||||
ccall [mtar_write_data], tar, str1, str1_len ; Записываем данныев в этот файл
|
|
||||||
|
|
||||||
ccall [mtar_finalize], tar ; Указываем что больше с tar работать не будем
|
|
||||||
ccall [mtar_close], tar ; Закрываем 'test.tar'
|
|
||||||
|
|
||||||
exit:
|
|
||||||
mcall SF_TERMINATE_PROCESS ; Выходим из программы
|
|
||||||
|
|
||||||
; data
|
|
||||||
|
|
||||||
str1 db 'Hello world!', 0
|
|
||||||
str1_len = $ - str1
|
|
||||||
|
|
||||||
str2 db 'Goodbye world!', 0
|
|
||||||
|
|
||||||
tar_fname db 'test.tar', 0
|
|
||||||
tar_fmode db 'w', 0
|
|
||||||
|
|
||||||
test1_txt db 'test1.txt', 0
|
|
||||||
|
|
||||||
tar rb 32
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
@IMPORT:
|
|
||||||
library mtar, 'mtar.obj'
|
|
||||||
import mtar, \
|
|
||||||
mtar_init, 'mtar_init', \
|
|
||||||
mtar_open, 'mtar_open', \
|
|
||||||
mtar_write_file_header, 'mtar_write_file_header', \
|
|
||||||
mtar_write_data, 'mtar_write_data', \
|
|
||||||
mtar_finalize, 'mtar_finalize', \
|
|
||||||
mtar_close, 'mtar_close'
|
|
||||||
|
|
||||||
IM_END:
|
|
||||||
align 4
|
|
||||||
rb 4096 ; stack
|
|
||||||
MEM:
|
|
||||||
@@ -1,450 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2017 rxi
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <sys/ksys.h>
|
|
||||||
|
|
||||||
#include "microtar.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char name[100];
|
|
||||||
char mode[8];
|
|
||||||
char owner[8];
|
|
||||||
char group[8];
|
|
||||||
char size[12];
|
|
||||||
char mtime[12];
|
|
||||||
char checksum[8];
|
|
||||||
char type;
|
|
||||||
char linkname[100];
|
|
||||||
char _padding[255];
|
|
||||||
} mtar_raw_header_t;
|
|
||||||
|
|
||||||
static void * mtar_memset( void * s, int c, size_t n ){
|
|
||||||
unsigned char * p = ( unsigned char * ) s;
|
|
||||||
while ( n-- ){
|
|
||||||
*p++ = ( unsigned char ) c;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MTAR_OBJ
|
|
||||||
// All pointers was changed for compatible to latest version tcc and the libc.obj headers
|
|
||||||
size_t (*_fread)(void *restrict, size_t size, size_t count, FILE *restrict)=NULL;
|
|
||||||
size_t (*_fwrite)(const void *restrict, size_t size, size_t count, FILE *restrict)=NULL;
|
|
||||||
int (*_fclose)(FILE *)=NULL;
|
|
||||||
FILE* (*_fopen)(const char *restrict, const char *restrict)=NULL;
|
|
||||||
int (*_fseek)(FILE *, long, int)=NULL;
|
|
||||||
long (*_ftell)(FILE *)=NULL;
|
|
||||||
int (*_sprintf)(char* buffer, const char* format, ...)=NULL;
|
|
||||||
int (*_sscanf)(const char*, const char *restrict, ...)=NULL;
|
|
||||||
int (*_strcmp)(const char * s1, const char* s2)=NULL;
|
|
||||||
char* (*_strchr)(const char* s, int c)=NULL;
|
|
||||||
char* (*_strcpy)(char* s1, const char* s2)=NULL;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static unsigned round_up(unsigned n, unsigned incr) {
|
|
||||||
return n + (incr - n % incr) % incr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static unsigned checksum(const mtar_raw_header_t* rh) {
|
|
||||||
unsigned i;
|
|
||||||
unsigned char *p = (unsigned char*) rh;
|
|
||||||
unsigned res = 256;
|
|
||||||
for (i = 0; i < offsetof(mtar_raw_header_t, checksum); i++) {
|
|
||||||
res += p[i];
|
|
||||||
}
|
|
||||||
for (i = offsetof(mtar_raw_header_t, type); i < sizeof(*rh); i++) {
|
|
||||||
res += p[i];
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int tread(mtar_t *tar, void *data, unsigned size) {
|
|
||||||
int err = tar->read(tar, data, size);
|
|
||||||
tar->pos += size;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int twrite(mtar_t *tar, const void *data, unsigned size) {
|
|
||||||
|
|
||||||
int err = tar->write(tar, data, size);
|
|
||||||
tar->pos += size;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int write_null_bytes(mtar_t *tar, int n) {
|
|
||||||
int i, err;
|
|
||||||
char nul = '\0';
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
err = twrite(tar, &nul, 1);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return MTAR_ESUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int raw_to_header(mtar_header_t *h, const mtar_raw_header_t *rh) {
|
|
||||||
unsigned chksum1, chksum2;
|
|
||||||
|
|
||||||
/* If the checksum starts with a null byte we assume the record is NULL */
|
|
||||||
if (*rh->checksum == '\0') {
|
|
||||||
return MTAR_ENULLRECORD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Build and compare checksum */
|
|
||||||
chksum1 = checksum(rh);
|
|
||||||
_sscanf(rh->checksum, "%o", &chksum2);
|
|
||||||
if (chksum1 != chksum2) {
|
|
||||||
return MTAR_EBADCHKSUM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Load raw header into header */
|
|
||||||
_sscanf(rh->mode, "%o", &h->mode);
|
|
||||||
_sscanf(rh->owner, "%o", &h->owner);
|
|
||||||
_sscanf(rh->size, "%o", &h->size);
|
|
||||||
_sscanf(rh->mtime, "%o", &h->mtime);
|
|
||||||
h->type = rh->type;
|
|
||||||
_strcpy(h->name, rh->name);
|
|
||||||
_strcpy(h->linkname, rh->linkname);
|
|
||||||
|
|
||||||
return MTAR_ESUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int header_to_raw(mtar_raw_header_t *rh, const mtar_header_t *h) {
|
|
||||||
unsigned chksum;
|
|
||||||
|
|
||||||
/* Load header into raw header */
|
|
||||||
mtar_memset(rh, 0, sizeof(*rh));
|
|
||||||
_sprintf(rh->mode, "%o", h->mode);
|
|
||||||
_sprintf(rh->owner, "%o", h->owner);
|
|
||||||
_sprintf(rh->size, "%o", h->size);
|
|
||||||
_sprintf(rh->mtime, "%o", h->mtime);
|
|
||||||
rh->type = h->type ? h->type : MTAR_TREG;
|
|
||||||
_strcpy(rh->name, h->name);
|
|
||||||
_strcpy(rh->linkname, h->linkname);
|
|
||||||
|
|
||||||
/* Calculate and write checksum */
|
|
||||||
chksum = checksum(rh);
|
|
||||||
_sprintf(rh->checksum, "%06o", chksum);
|
|
||||||
rh->checksum[7] = ' ';
|
|
||||||
|
|
||||||
return MTAR_ESUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const char* mtar_strerror(int err) {
|
|
||||||
switch (err) {
|
|
||||||
case MTAR_ESUCCESS : return "success";
|
|
||||||
case MTAR_EFAILURE : return "failure";
|
|
||||||
case MTAR_EOPENFAIL : return "could not open";
|
|
||||||
case MTAR_EREADFAIL : return "could not read";
|
|
||||||
case MTAR_EWRITEFAIL : return "could not write";
|
|
||||||
case MTAR_ESEEKFAIL : return "could not seek";
|
|
||||||
case MTAR_EBADCHKSUM : return "bad checksum";
|
|
||||||
case MTAR_ENULLRECORD : return "null record";
|
|
||||||
case MTAR_ENOTFOUND : return "file not found";
|
|
||||||
}
|
|
||||||
return "unknown error";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int file_write(mtar_t *tar, const void *data, unsigned size) {
|
|
||||||
unsigned res = _fwrite(data, 1, size, tar->stream);
|
|
||||||
return (res == size) ? MTAR_ESUCCESS : MTAR_EWRITEFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int file_read(mtar_t *tar, void *data, unsigned size) {
|
|
||||||
unsigned res = _fread(data, 1, size, tar->stream);
|
|
||||||
return (res == size) ? MTAR_ESUCCESS : MTAR_EREADFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int file_seek(mtar_t *tar, unsigned offset) {
|
|
||||||
int res = _fseek(tar->stream, offset, SEEK_SET);
|
|
||||||
return (res == 0) ? MTAR_ESUCCESS : MTAR_ESEEKFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int file_close(mtar_t *tar) {
|
|
||||||
_fclose(tar->stream);
|
|
||||||
return MTAR_ESUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_open(mtar_t *tar, const char *filename, const char *mode) {
|
|
||||||
int err;
|
|
||||||
mtar_header_t h;
|
|
||||||
|
|
||||||
/* Init tar struct and functions */
|
|
||||||
mtar_memset(tar, 0, sizeof(*tar));
|
|
||||||
tar->write = file_write;
|
|
||||||
tar->read = file_read;
|
|
||||||
tar->seek = file_seek;
|
|
||||||
tar->close = file_close;
|
|
||||||
|
|
||||||
/* Assure mode is always binary */
|
|
||||||
if ( _strchr(mode, 'r') ) mode = "rb";
|
|
||||||
if ( _strchr(mode, 'w') ) mode = "wb";
|
|
||||||
if ( _strchr(mode, 'a') ) mode = "ab";
|
|
||||||
/* Open file */
|
|
||||||
tar->stream = _fopen(filename, mode);
|
|
||||||
if (!tar->stream) {
|
|
||||||
return MTAR_EOPENFAIL;
|
|
||||||
}
|
|
||||||
/* Read first header to check it is valid if mode is `r` */
|
|
||||||
if (*mode == 'r') {
|
|
||||||
err = mtar_read_header(tar, &h);
|
|
||||||
if (err != MTAR_ESUCCESS) {
|
|
||||||
mtar_close(tar);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return ok */
|
|
||||||
return MTAR_ESUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_close(mtar_t *tar) {
|
|
||||||
return tar->close(tar);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_seek(mtar_t *tar, unsigned pos) {
|
|
||||||
int err = tar->seek(tar, pos);
|
|
||||||
tar->pos = pos;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_rewind(mtar_t *tar) {
|
|
||||||
tar->remaining_data = 0;
|
|
||||||
tar->last_header = 0;
|
|
||||||
return mtar_seek(tar, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_next(mtar_t *tar) {
|
|
||||||
int err, n;
|
|
||||||
mtar_header_t h;
|
|
||||||
/* Load header */
|
|
||||||
err = mtar_read_header(tar, &h);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
/* Seek to next record */
|
|
||||||
n = round_up(h.size, 512) + sizeof(mtar_raw_header_t);
|
|
||||||
return mtar_seek(tar, tar->pos + n);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_find(mtar_t *tar, const char *name, mtar_header_t *h) {
|
|
||||||
int err;
|
|
||||||
mtar_header_t header;
|
|
||||||
/* Start at beginning */
|
|
||||||
err = mtar_rewind(tar);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
/* Iterate all files until we hit an error or find the file */
|
|
||||||
while ( (err = mtar_read_header(tar, &header)) == MTAR_ESUCCESS ) {
|
|
||||||
if ( !_strcmp(header.name, name) ) {
|
|
||||||
if (h) {
|
|
||||||
*h = header;
|
|
||||||
}
|
|
||||||
return MTAR_ESUCCESS;
|
|
||||||
}
|
|
||||||
mtar_next(tar);
|
|
||||||
}
|
|
||||||
/* Return error */
|
|
||||||
if (err == MTAR_ENULLRECORD) {
|
|
||||||
err = MTAR_ENOTFOUND;
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_read_header(mtar_t *tar, mtar_header_t *h) {
|
|
||||||
int err;
|
|
||||||
mtar_raw_header_t rh;
|
|
||||||
/* Save header position */
|
|
||||||
tar->last_header = tar->pos;
|
|
||||||
/* Read raw header */
|
|
||||||
err = tread(tar, &rh, sizeof(rh));
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
/* Seek back to start of header */
|
|
||||||
err = mtar_seek(tar, tar->last_header);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
/* Load raw header into header struct and return */
|
|
||||||
return raw_to_header(h, &rh);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_read_data(mtar_t *tar, void *ptr, unsigned size) {
|
|
||||||
int err;
|
|
||||||
/* If we have no remaining data then this is the first read, we get the size,
|
|
||||||
* set the remaining data and seek to the beginning of the data */
|
|
||||||
if (tar->remaining_data == 0) {
|
|
||||||
mtar_header_t h;
|
|
||||||
/* Read header */
|
|
||||||
err = mtar_read_header(tar, &h);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
/* Seek past header and init remaining data */
|
|
||||||
err = mtar_seek(tar, tar->pos + sizeof(mtar_raw_header_t));
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
tar->remaining_data = h.size;
|
|
||||||
}
|
|
||||||
/* Read data */
|
|
||||||
err = tread(tar, ptr, size);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
tar->remaining_data -= size;
|
|
||||||
/* If there is no remaining data we've finished reading and seek back to the
|
|
||||||
* header */
|
|
||||||
if (tar->remaining_data == 0) {
|
|
||||||
return mtar_seek(tar, tar->last_header);
|
|
||||||
}
|
|
||||||
return MTAR_ESUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_write_header(mtar_t *tar, const mtar_header_t *h) {
|
|
||||||
mtar_raw_header_t rh;
|
|
||||||
/* Build raw header and write */
|
|
||||||
header_to_raw(&rh, h);
|
|
||||||
tar->remaining_data = h->size;
|
|
||||||
return twrite(tar, &rh, sizeof(rh));
|
|
||||||
}
|
|
||||||
|
|
||||||
int mtar_write_file_header(mtar_t *tar, const char *name, unsigned size) {
|
|
||||||
mtar_header_t h;
|
|
||||||
/* Build header */
|
|
||||||
mtar_memset(&h, 0, sizeof(h));
|
|
||||||
_strcpy(h.name, name);
|
|
||||||
h.size = size;
|
|
||||||
h.type = MTAR_TREG;
|
|
||||||
h.mode = 0664;
|
|
||||||
/* Write header */
|
|
||||||
return mtar_write_header(tar, &h);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_write_dir_header(mtar_t *tar, const char *name) {
|
|
||||||
mtar_header_t h;
|
|
||||||
/* Build header */
|
|
||||||
mtar_memset(&h, 0, sizeof(h));
|
|
||||||
_strcpy(h.name, name);
|
|
||||||
h.type = MTAR_TDIR;
|
|
||||||
h.mode = 0775;
|
|
||||||
/* Write header */
|
|
||||||
return mtar_write_header(tar, &h);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_write_data(mtar_t *tar, const void *data, unsigned size) {
|
|
||||||
int err;
|
|
||||||
/* Write data */
|
|
||||||
err = twrite(tar, data, size);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
tar->remaining_data -= size;
|
|
||||||
/* Write padding if we've written all the data for this file */
|
|
||||||
if (tar->remaining_data == 0) {
|
|
||||||
return write_null_bytes(tar, round_up(tar->pos, 512) - tar->pos);
|
|
||||||
}
|
|
||||||
return MTAR_ESUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mtar_finalize(mtar_t *tar) {
|
|
||||||
/* Write two NULL records */
|
|
||||||
return write_null_bytes(tar, sizeof(mtar_raw_header_t) * 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Load libc.obj */
|
|
||||||
|
|
||||||
#ifdef MTAR_OBJ
|
|
||||||
|
|
||||||
#include <sys/ksys.h>
|
|
||||||
|
|
||||||
int mtar_init(){
|
|
||||||
ksys_dll_t *libc = _ksys_dlopen("/sys/lib/libc.obj");
|
|
||||||
if(!libc){
|
|
||||||
_ksys_debug_puts("mtar.obj: libc.obj not loaded!");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
_fread = _ksys_dlsym(libc, "fread");
|
|
||||||
_fwrite = _ksys_dlsym(libc, "fwrite");
|
|
||||||
_fclose = _ksys_dlsym(libc, "fclose");
|
|
||||||
_fopen = _ksys_dlsym(libc, "fopen");
|
|
||||||
_fseek = _ksys_dlsym(libc, "fseek");
|
|
||||||
_ftell = _ksys_dlsym(libc, "ftell");
|
|
||||||
_sprintf= _ksys_dlsym(libc, "sprintf");
|
|
||||||
_sscanf = _ksys_dlsym(libc, "sscanf");
|
|
||||||
_strcmp = _ksys_dlsym(libc, "strcmp");
|
|
||||||
_strchr = _ksys_dlsym(libc, "strchr");
|
|
||||||
_strcpy = _ksys_dlsym(libc, "strcpy");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ksys_dll_t EXPORTS[] = {
|
|
||||||
{"mtar_init", mtar_init},
|
|
||||||
{"mtar_open", mtar_open},
|
|
||||||
{"mtar_close", mtar_close},
|
|
||||||
{"mtar_seek", mtar_seek},
|
|
||||||
{"mtar_rewind", mtar_rewind},
|
|
||||||
{"mtar_next", mtar_next},
|
|
||||||
{"mtar_find", mtar_find},
|
|
||||||
{"mtar_read_header", mtar_read_header},
|
|
||||||
{"mtar_read_data", mtar_read_data},
|
|
||||||
{"mtar_write_header", mtar_write_header},
|
|
||||||
{"mtar_write_file_header", mtar_write_file_header},
|
|
||||||
{"mtar_write_dir_header", mtar_write_dir_header},
|
|
||||||
{"mtar_write_data",mtar_write_data},
|
|
||||||
{"mtar_finalize", mtar_finalize},
|
|
||||||
{"mtar_strerror", mtar_strerror},
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2017 rxi
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the MIT license. See `microtar.c` for details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MICROTAR_H
|
|
||||||
#define MICROTAR_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#define MTAR_VERSION "0.1.0"
|
|
||||||
|
|
||||||
enum {
|
|
||||||
MTAR_ESUCCESS = 0,
|
|
||||||
MTAR_EFAILURE = -1,
|
|
||||||
MTAR_EOPENFAIL = -2,
|
|
||||||
MTAR_EREADFAIL = -3,
|
|
||||||
MTAR_EWRITEFAIL = -4,
|
|
||||||
MTAR_ESEEKFAIL = -5,
|
|
||||||
MTAR_EBADCHKSUM = -6,
|
|
||||||
MTAR_ENULLRECORD = -7,
|
|
||||||
MTAR_ENOTFOUND = -8
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
MTAR_TREG = '0',
|
|
||||||
MTAR_TLNK = '1',
|
|
||||||
MTAR_TSYM = '2',
|
|
||||||
MTAR_TCHR = '3',
|
|
||||||
MTAR_TBLK = '4',
|
|
||||||
MTAR_TDIR = '5',
|
|
||||||
MTAR_TFIFO = '6'
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned mode;
|
|
||||||
unsigned owner;
|
|
||||||
unsigned size;
|
|
||||||
unsigned mtime;
|
|
||||||
unsigned type;
|
|
||||||
char name[100];
|
|
||||||
char linkname[100];
|
|
||||||
} mtar_header_t;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct mtar_t mtar_t;
|
|
||||||
|
|
||||||
#pragma pack(push,1)
|
|
||||||
struct mtar_t {
|
|
||||||
int (*read)(mtar_t *tar, void *data, unsigned size);
|
|
||||||
int (*write)(mtar_t *tar, const void *data, unsigned size);
|
|
||||||
int (*seek)(mtar_t *tar, unsigned pos);
|
|
||||||
int (*close)(mtar_t *tar);
|
|
||||||
void *stream;
|
|
||||||
unsigned pos;
|
|
||||||
unsigned remaining_data;
|
|
||||||
unsigned last_header;
|
|
||||||
};
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
const char* mtar_strerror(int err);
|
|
||||||
|
|
||||||
int mtar_open(mtar_t *tar, const char *filename, const char *mode);
|
|
||||||
int mtar_close(mtar_t *tar);
|
|
||||||
|
|
||||||
int mtar_seek(mtar_t *tar, unsigned pos);
|
|
||||||
int mtar_rewind(mtar_t *tar);
|
|
||||||
int mtar_next(mtar_t *tar);
|
|
||||||
int mtar_find(mtar_t *tar, const char *name, mtar_header_t *h);
|
|
||||||
int mtar_read_header(mtar_t *tar, mtar_header_t *h);
|
|
||||||
int mtar_read_data(mtar_t *tar, void *ptr, unsigned size);
|
|
||||||
|
|
||||||
int mtar_write_header(mtar_t *tar, const mtar_header_t *h);
|
|
||||||
int mtar_write_file_header(mtar_t *tar, const char *name, unsigned size);
|
|
||||||
int mtar_write_dir_header(mtar_t *tar, const char *name);
|
|
||||||
int mtar_write_data(mtar_t *tar, const void *data, unsigned size);
|
|
||||||
int mtar_finalize(mtar_t *tar);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
MTAR_ESUCCESS = 0
|
|
||||||
MTAR_EFAILURE = -1
|
|
||||||
MTAR_EOPENFAIL = -2
|
|
||||||
MTAR_EREADFAIL = -3
|
|
||||||
MTAR_EWRITEFAIL = -4
|
|
||||||
MTAR_ESEEKFAIL = -5
|
|
||||||
MTAR_EBADCHKSUM = -6
|
|
||||||
MTAR_ENULLRECORD = -7
|
|
||||||
MTAR_ENOTFOUND = -8
|
|
||||||
|
|
||||||
MTAR_TREG = '0'
|
|
||||||
MTAR_TLNK = '1'
|
|
||||||
MTAR_TSYM = '2'
|
|
||||||
MTAR_TCHR = '3'
|
|
||||||
MTAR_TBLK = '4'
|
|
||||||
MTAR_TDIR = '5'
|
|
||||||
MTAR_TFIFO = '6'
|
|
||||||
|
|
||||||
struct mtar_header_t
|
|
||||||
mode dd ?
|
|
||||||
owner dd ?
|
|
||||||
size dd ?
|
|
||||||
mtime dd ?
|
|
||||||
type dd ?
|
|
||||||
name rb 100
|
|
||||||
linkname rb 100
|
|
||||||
ends
|
|
||||||
|
|
||||||
struct mtar_t
|
|
||||||
read_func dd ?
|
|
||||||
write_func dd ?
|
|
||||||
seek_func dd ?
|
|
||||||
close_func dd ?
|
|
||||||
stream dd ?
|
|
||||||
pos dd ?
|
|
||||||
remaining_data dd ?
|
|
||||||
last_header dd ?
|
|
||||||
ends
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
KTCC_DIR=../../develop/ktcc/trunk
|
|
||||||
|
|
||||||
NAME=gamehack
|
|
||||||
|
|
||||||
KTCC=$(KTCC_DIR)/bin/kos32-tcc
|
|
||||||
KPACK=kpack
|
|
||||||
|
|
||||||
SRC=gh_shell.c
|
|
||||||
CFLAGS=-I $(KTCC_DIR)/libc/include
|
|
||||||
LIBS = -lck
|
|
||||||
|
|
||||||
all:
|
|
||||||
$(KTCC) $(CFLAGS) $(SRC) $(LIBS) -o $(NAME)
|
|
||||||
$(KPACK) $(NAME)
|
|
||||||
clean:
|
|
||||||
rm $(NAME)
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
int PID=-1;
|
|
||||||
|
|
||||||
int kdebugger_write(unsigned ID, unsigned n, unsigned addr, unsigned* buff)
|
|
||||||
{
|
|
||||||
int num;
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"int $0x40"
|
|
||||||
:"=a"(num)
|
|
||||||
:"a"(69), "b"(7), "c"(ID), "d"(n),"S"(addr),"D"(buff)
|
|
||||||
);
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
int kdebugger_read(unsigned ID, unsigned n, unsigned addr, unsigned* buff)
|
|
||||||
{
|
|
||||||
int num;
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"int $0x40"
|
|
||||||
:"=a"(num)
|
|
||||||
:"a"(69), "b"(6), "c"(ID), "d"(n),"S"(addr),"D"(buff)
|
|
||||||
);
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
void kdebugger_pause(unsigned ID)
|
|
||||||
{
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"int $0x40"
|
|
||||||
::"a"(69), "b"(4), "c"(ID)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void kdebugger_play(unsigned ID)
|
|
||||||
{
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"int $0x40"
|
|
||||||
::"a"(69), "b"(5), "c"(ID)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void kdebugger_disconnect(unsigned ID)
|
|
||||||
{
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"int $0x40"
|
|
||||||
::"a"(69), "b"(3), "c"(ID)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
int load_game(char *app_name, char *args)
|
|
||||||
{
|
|
||||||
#pragma pack(push, 1)
|
|
||||||
struct file_op_t
|
|
||||||
{
|
|
||||||
unsigned fn;
|
|
||||||
unsigned flags;
|
|
||||||
char* args;
|
|
||||||
unsigned res1, res2;
|
|
||||||
char zero;
|
|
||||||
char* app_name __attribute__((packed));
|
|
||||||
} file_op;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
memset(&file_op, 0, sizeof(file_op));
|
|
||||||
file_op.fn = 7;
|
|
||||||
file_op.flags = 1;
|
|
||||||
file_op.args = args;
|
|
||||||
file_op.app_name = app_name;
|
|
||||||
|
|
||||||
register int val;
|
|
||||||
asm volatile ("int $0x40":"=a"(val):"a"(70), "b"(&file_op));
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
#include <conio.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <kos32sys1.h>
|
|
||||||
#include "gh_core.c"
|
|
||||||
|
|
||||||
#define CMD_LEN 255
|
|
||||||
#define TITLE "GameHack 1.0 ALPHA "
|
|
||||||
|
|
||||||
char cmd_line[CMD_LEN];
|
|
||||||
char cmd_line_tmp[CMD_LEN];
|
|
||||||
|
|
||||||
void notify_show(char *text)
|
|
||||||
{
|
|
||||||
start_app("/sys/@notify", text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cmd_processing()
|
|
||||||
{
|
|
||||||
strcpy(cmd_line_tmp, cmd_line);
|
|
||||||
char *cmd = strtok(cmd_line_tmp, " \n");
|
|
||||||
if(!strcmp(cmd, "pause")){
|
|
||||||
kdebugger_pause(PID);
|
|
||||||
}
|
|
||||||
else if(!strcmp(cmd, "play")){
|
|
||||||
kdebugger_play(PID);
|
|
||||||
}
|
|
||||||
else if(!strcmp(cmd, "exit")){
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
else if(!strcmp(cmd, "write")){
|
|
||||||
unsigned addr=0;
|
|
||||||
int val =0;
|
|
||||||
if(sscanf(cmd_line, "%s %x %d %d",cmd_line, &addr, &val, &val)==3){
|
|
||||||
if(kdebugger_write(PID, sizeof(int), addr, &val)==-1){
|
|
||||||
puts("Memory write error!");
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
puts("Invalid arguments!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(!strcmp(cmd, "read")){
|
|
||||||
unsigned addr=0;
|
|
||||||
int val =0;
|
|
||||||
if(sscanf(cmd_line, "%s %x %x",cmd_line, &addr, &addr)==2){
|
|
||||||
if(kdebugger_read(PID, sizeof(int), addr, &val)==-1){
|
|
||||||
puts("Memory read error!");
|
|
||||||
}
|
|
||||||
printf("0x%.8X: %d\n", addr, val);
|
|
||||||
}else{
|
|
||||||
puts("Invalid arguments!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
else if(!strcmp(cmd, "help"))
|
|
||||||
{
|
|
||||||
puts("Commands:");
|
|
||||||
puts(" write [addres] [value] - Write DWORD value by address.");
|
|
||||||
puts(" read [addres] [value] - Read DWORD value by address.");
|
|
||||||
puts(" pause - Suspend the game (process)." );
|
|
||||||
puts(" play - Resume running the game(process).");
|
|
||||||
puts(" find [value] - Search for DWORD value in memory(VIP).");
|
|
||||||
}
|
|
||||||
else if(!strcmp(cmd, "find"))
|
|
||||||
{
|
|
||||||
puts("Not yet implemented ...");
|
|
||||||
}
|
|
||||||
else if(cmd != NULL){
|
|
||||||
puts("Unknown command!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
if (argc!=2 ){
|
|
||||||
notify_show("'No game selected!' -E");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
con_init_console_dll();
|
|
||||||
con_set_title(TITLE);
|
|
||||||
PID = load_game(argv[1], NULL);
|
|
||||||
PID = 2;
|
|
||||||
if(PID<0){
|
|
||||||
notify_show("'Game not loaded!' -E");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
kdebugger_play(PID);
|
|
||||||
while (1){
|
|
||||||
printf("GameHack> ");
|
|
||||||
con_gets(cmd_line, CMD_LEN);
|
|
||||||
cmd_processing();
|
|
||||||
memset(cmd_line, '\n', CMD_LEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
KTCC_DIR=../../develop/ktcc/trunk
|
|
||||||
|
|
||||||
NAME=teatool
|
|
||||||
|
|
||||||
KTCC=$(KTCC_DIR)/bin/kos32-tcc
|
|
||||||
KPACK=kpack
|
|
||||||
|
|
||||||
SRC=teatool.c
|
|
||||||
CFLAGS=-nostdinc -I $(KTCC_DIR)/libc/include
|
|
||||||
LFLAGS=-nostdlib -L $(KTCC_DIR)/bin/lib $(KTCC_DIR)/bin/lib/start.o
|
|
||||||
LIBS = -lck
|
|
||||||
|
|
||||||
all:
|
|
||||||
$(KTCC) $(CFLAGS) $(LFLAGS) $(SRC) $(LIBS) -o $(NAME)
|
|
||||||
$(KPACK) $(NAME)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm $(NAME)
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#define INVALID_ARG "Invalid arguments! Use the help: -h!\n"
|
|
||||||
#define KEY_RECORD_IN_FILE "The key is recorded in file: %s\n"
|
|
||||||
#define INCORRECT_FILE "Error! Incorrect file:'%s'\n"
|
|
||||||
#define NO_KEY_OR_KEYFILE "No key or key file!\n"
|
|
||||||
#define INVALID_KEY_FORMAT "Invalid key format!\n"
|
|
||||||
#define FILE_NOT_FOUND "File '%s' not found!\n"
|
|
||||||
#define DATA_DECRYPT "Data from file: %s successfully DECRYPTED to file: %s\n"
|
|
||||||
#define DATA_ENCRYPT "Data from file: %s successfully ENCRYPTED to file: %s\n"
|
|
||||||
#define FILE_DECRYPTION "File decryption...\n"
|
|
||||||
#define FILE_ENCRYPTION "File encryption...\n"
|
|
||||||
#define RECORD_DECRYPT_DATA "Record decryped data...\n"
|
|
||||||
#define LOAD_IN_RAM "Loading a '%s' file in RAM...\n"
|
|
||||||
#define RECORD_ENCRYPT_DATA "Record encryped data...\n"
|
|
||||||
#define MEMORY_ERROR "To big file, not enough memory! Use normal mode."
|
|
||||||
|
|
||||||
void show_help()
|
|
||||||
{
|
|
||||||
puts("Usage: \nTEAtool [infile] [outfile] [arguments]\n");
|
|
||||||
puts("Arguments:");
|
|
||||||
puts("-e [mode] Encrypt file in 'speed' or 'normal' mode.");
|
|
||||||
puts("-d [mode] Decrypt file in 'speed' or 'normal' mode.");
|
|
||||||
puts(" In 'speed' mode, file is entirely loaded into RAM.");
|
|
||||||
puts(" In 'normal' mode, file is loaded with parts in RAM.");
|
|
||||||
puts("-k [key] 128bit-key in hex format.");
|
|
||||||
puts("-K [keyfile] Use key from file.");
|
|
||||||
puts("-r [key] [keyfile].key Key entry to key file.");
|
|
||||||
puts("-h This reference");
|
|
||||||
puts("-a About the program \n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void show_about()
|
|
||||||
{
|
|
||||||
puts("\n");
|
|
||||||
puts("-----------TEAtool-ENG-----------\n");
|
|
||||||
printf(" ) ( Version: \n");
|
|
||||||
printf(" ( ) ) 1.8-stable \n");
|
|
||||||
printf(" ) ( ( \n");
|
|
||||||
printf(" _______)_ Author: \n");
|
|
||||||
printf(" .-'---------| turbocat2001 \n");
|
|
||||||
printf("( C|/////////| \n");
|
|
||||||
printf(" '-./////////| Tester: rgimad \n");
|
|
||||||
printf(" '_________' \n");
|
|
||||||
printf(" '-------'' License: GPLv3 \n\n");
|
|
||||||
printf(" Powered by: \n");
|
|
||||||
printf(" Tiny Encryption Algorithm. \n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
Encrypting the "in.file" file with the "FFAB1100C176001F1ADDB8E792001EA5" key in normal mode:
|
|
||||||
# teatool in.file out.file -k FFAB1100C176001F1ADDB8E792001EA5 -e normal
|
|
||||||
Encrypting the "in.file" file with the key-file "my.key" in speed mode:*
|
|
||||||
# teatool in.file out.file -K my.key -e speed
|
|
||||||
Writing the "FFAB1100C176001F1ADDB8E792001EA5" key to the key-file "my.key"*
|
|
||||||
# teatool -r FFAB1100C176001F1ADDB8E792001EA5 my
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
void TEA_encrypt (uint32_t block[2], uint32_t key[4])
|
|
||||||
{
|
|
||||||
/* set up */
|
|
||||||
uint32_t v0 = block[0];
|
|
||||||
uint32_t v1 = block[1];
|
|
||||||
uint32_t sum = 0;
|
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
/* a key schedule constant */
|
|
||||||
uint32_t delta = 0x9e3779b9;
|
|
||||||
|
|
||||||
/* cache key */
|
|
||||||
uint32_t k0 = key[0];
|
|
||||||
uint32_t k1 = key[1];
|
|
||||||
uint32_t k2 = key[2];
|
|
||||||
uint32_t k3 = key[3];
|
|
||||||
|
|
||||||
/* basic cycle start */
|
|
||||||
for (i = 0; i < 32; i++)
|
|
||||||
{
|
|
||||||
sum += delta;
|
|
||||||
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
|
|
||||||
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
|
|
||||||
}
|
|
||||||
/* end cycle */
|
|
||||||
|
|
||||||
block[0] = v0;
|
|
||||||
block[1] = v1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TEA_decrypt (uint32_t* block, uint32_t* key)
|
|
||||||
{
|
|
||||||
/* set up */
|
|
||||||
uint32_t v0 = block[0];
|
|
||||||
uint32_t v1 = block[1];
|
|
||||||
uint32_t sum = 0xC6EF3720;
|
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
/* a key schedule constant */
|
|
||||||
uint32_t delta = 0x9e3779b9;
|
|
||||||
|
|
||||||
/* cache key */
|
|
||||||
uint32_t k0 = key[0];
|
|
||||||
uint32_t k1 = key[1];
|
|
||||||
uint32_t k2 = key[2];
|
|
||||||
uint32_t k3 = key[3];
|
|
||||||
|
|
||||||
/* basic cycle start */
|
|
||||||
for (i = 0; i < 32; i++)
|
|
||||||
{
|
|
||||||
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
|
|
||||||
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
|
|
||||||
sum -= delta;
|
|
||||||
}
|
|
||||||
/* end cycle */
|
|
||||||
|
|
||||||
block[0] = v0;
|
|
||||||
block[1] = v1;
|
|
||||||
}
|
|
||||||
@@ -1,303 +0,0 @@
|
|||||||
/* Copyright (C) 2019-2021 Logaev Maxim (turbocat2001), GPLv2 */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <conio.h>
|
|
||||||
|
|
||||||
#include "lang_en.c"
|
|
||||||
#include "tea.c"
|
|
||||||
|
|
||||||
#define ENCRYPT 1
|
|
||||||
#define DECRYPT 2
|
|
||||||
|
|
||||||
typedef unsigned char flag;
|
|
||||||
uint32_t key[4];
|
|
||||||
|
|
||||||
long size_orig_file(FILE* file)
|
|
||||||
{
|
|
||||||
fseek(file, 0, SEEK_END);
|
|
||||||
long size = ftell(file);
|
|
||||||
fseek(file, 0, SEEK_SET);
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
long size_xcrypt_file(FILE* file)
|
|
||||||
{
|
|
||||||
fseek(file, 0, SEEK_END);
|
|
||||||
long size = ftell(file);
|
|
||||||
fseek(file, 0, SEEK_SET);
|
|
||||||
if(size%8==0) {
|
|
||||||
return size;
|
|
||||||
}else{
|
|
||||||
return (size/8+1)*8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void xcrypt_file_speed(char *in_file, char* out_file, char arg)
|
|
||||||
{
|
|
||||||
FILE *input, *output;
|
|
||||||
|
|
||||||
if((input = fopen(in_file,"rb"))==NULL){
|
|
||||||
printf(FILE_NOT_FOUND, in_file);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
output = fopen(out_file,"wb");
|
|
||||||
|
|
||||||
long size_f=size_xcrypt_file(input);
|
|
||||||
uint8_t size_diff;
|
|
||||||
size_diff=(uint8_t)(size_f-size_orig_file(input));
|
|
||||||
uint32_t *buff;
|
|
||||||
buff=malloc(size_f);
|
|
||||||
if(!buff) {
|
|
||||||
puts(MEMORY_ERROR);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(arg==ENCRYPT){
|
|
||||||
printf(LOAD_IN_RAM,in_file);
|
|
||||||
fread(buff, 1,size_f, input);
|
|
||||||
printf(FILE_ENCRYPTION);
|
|
||||||
|
|
||||||
for(long i=0; i<(size_f/4); i=i+2)
|
|
||||||
{
|
|
||||||
TEA_encrypt(buff+i,key);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf(RECORD_ENCRYPT_DATA);
|
|
||||||
fwrite(&size_diff,1, 1, output);
|
|
||||||
fwrite(buff,1,size_f, output);
|
|
||||||
fclose(input);
|
|
||||||
fclose(output);
|
|
||||||
printf(DATA_ENCRYPT,in_file,out_file);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(arg==DECRYPT){
|
|
||||||
long size_f=size_orig_file(input);
|
|
||||||
printf(LOAD_IN_RAM,in_file);
|
|
||||||
fread(&size_diff,1,1,input);
|
|
||||||
fread(buff,1,size_f-1, input);
|
|
||||||
printf(FILE_DECRYPTION);
|
|
||||||
|
|
||||||
for(long i=0; i<size_f/4; i=i+2)
|
|
||||||
{
|
|
||||||
TEA_decrypt(buff+i,key);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf(RECORD_DECRYPT_DATA);
|
|
||||||
fwrite(buff,1,size_f-size_diff-1, output);
|
|
||||||
fclose(input);
|
|
||||||
fclose(output);
|
|
||||||
printf(DATA_DECRYPT,in_file,out_file);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void xcrypt_file(char *in_file, char* out_file, char arg)
|
|
||||||
{
|
|
||||||
uint32_t temp_block[2];
|
|
||||||
FILE *input, *output;
|
|
||||||
|
|
||||||
if((input = fopen(in_file,"rb"))==NULL){
|
|
||||||
printf(FILE_NOT_FOUND, in_file);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
output = fopen(out_file,"wb");
|
|
||||||
|
|
||||||
register long size_f=size_xcrypt_file(input);
|
|
||||||
uint8_t size_diff=(uint8_t)(size_f-size_orig_file(input));
|
|
||||||
|
|
||||||
if(arg==ENCRYPT){
|
|
||||||
fwrite(&size_diff,1,1,output);
|
|
||||||
printf(FILE_ENCRYPTION);
|
|
||||||
|
|
||||||
while(!feof(input))
|
|
||||||
{
|
|
||||||
memset(temp_block, 0x00, 2);
|
|
||||||
fread(temp_block, sizeof(uint32_t), 2, input) ;
|
|
||||||
TEA_encrypt(temp_block,key);
|
|
||||||
fwrite(temp_block, sizeof(uint32_t),2, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(input);
|
|
||||||
fclose(output);
|
|
||||||
printf(DATA_ENCRYPT,in_file,out_file);
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if(arg==DECRYPT){
|
|
||||||
size_f = size_orig_file(input);
|
|
||||||
fread(&size_diff,1,1,input);
|
|
||||||
size_f=size_f-size_diff-1;
|
|
||||||
printf(FILE_DECRYPTION);
|
|
||||||
|
|
||||||
while(!feof(input))
|
|
||||||
{
|
|
||||||
fread(temp_block, sizeof(uint32_t), 2, input);
|
|
||||||
TEA_decrypt(temp_block,key);
|
|
||||||
|
|
||||||
if(size_f>=8){
|
|
||||||
fwrite(temp_block,sizeof(uint32_t),2,output);
|
|
||||||
}else{
|
|
||||||
fwrite(temp_block,1,size_f,output);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_f=size_f-8;
|
|
||||||
|
|
||||||
if(size_f<0){
|
|
||||||
size_f=0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(input);
|
|
||||||
fclose(output);
|
|
||||||
printf(DATA_DECRYPT,in_file,out_file);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void str_to_strkey(char *str, char str_key[4][9])
|
|
||||||
{
|
|
||||||
int count=0;
|
|
||||||
for(int i=0; i<4; i++)
|
|
||||||
{
|
|
||||||
int j=0;
|
|
||||||
while (j<8)
|
|
||||||
{
|
|
||||||
str_key[i][j]=str[count];
|
|
||||||
count++;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int valid_key(char *str)
|
|
||||||
{
|
|
||||||
int count=0;
|
|
||||||
char hex[]={"abcdefABCDEF0123456789"};
|
|
||||||
for(int i=0; i<32; i++)
|
|
||||||
{
|
|
||||||
if(strchr(hex,str[i])!=NULL){
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(count==32){return 1;}
|
|
||||||
else{ return 0;}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void key_con_read(char *str)
|
|
||||||
{
|
|
||||||
char str_key[4][9];
|
|
||||||
if(valid_key(str)&&(strlen(str)==32))
|
|
||||||
{
|
|
||||||
for(int i=0; i<4; i++){
|
|
||||||
str_to_strkey(str, str_key);
|
|
||||||
key[i]=(uint32_t)strtol(str_key[i],NULL,16);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
printf(INVALID_KEY_FORMAT);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void key_file_read(char *key_file)
|
|
||||||
{
|
|
||||||
FILE *keyfile;
|
|
||||||
if((keyfile = fopen(key_file,"rb"))==NULL){
|
|
||||||
printf(FILE_NOT_FOUND, key_file);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(size_orig_file(keyfile)==16) {
|
|
||||||
fread(key,sizeof(uint32_t),4, keyfile);
|
|
||||||
}else{
|
|
||||||
printf(INVALID_KEY_FORMAT);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
fclose(keyfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void findopt(int argc, char *argv[],char *in_file, char *out_file)
|
|
||||||
{
|
|
||||||
char found=0;
|
|
||||||
for(int j=3; j<argc; j++)
|
|
||||||
{
|
|
||||||
if(!strcmp(argv[j],"-k")){
|
|
||||||
found=1;
|
|
||||||
key_con_read(argv[j+1]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if(!strcmp(argv[j],"-K")){
|
|
||||||
found=1;
|
|
||||||
key_file_read(argv[j+1]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!found){
|
|
||||||
printf(NO_KEY_OR_KEYFILE);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int i=3;i<argc; i++){
|
|
||||||
if(!strcmp(argv[i],"-e"))
|
|
||||||
{
|
|
||||||
if(!strcmp(argv[i+1],"normal")){xcrypt_file(in_file, out_file, ENCRYPT);}
|
|
||||||
if(!strcmp(argv[i+1],"speed")){xcrypt_file_speed(in_file, out_file, ENCRYPT);}
|
|
||||||
}
|
|
||||||
if(!strcmp(argv[i],"-d"))
|
|
||||||
{
|
|
||||||
if(!strcmp(argv[i+1],"normal")){xcrypt_file(in_file, out_file, DECRYPT);}
|
|
||||||
if(!strcmp(argv[i+1],"speed")){xcrypt_file_speed(in_file, out_file, DECRYPT);}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf(INVALID_ARG);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void key_write_in_file(char *keyfilename)
|
|
||||||
{
|
|
||||||
FILE *keyfile;
|
|
||||||
if((keyfile = fopen(strcat(keyfilename, ".key"), "wb"))==NULL){
|
|
||||||
printf(INCORRECT_FILE, keyfilename);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
fwrite(key,sizeof(uint8_t), 16, keyfile);
|
|
||||||
printf(KEY_RECORD_IN_FILE, keyfilename);
|
|
||||||
fclose(keyfile);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
con_init_console_dll();
|
|
||||||
con_set_title("TEAtool\0");
|
|
||||||
if(argc==7){
|
|
||||||
findopt(argc,argv, argv[1],argv[2]);
|
|
||||||
}
|
|
||||||
else if(argc==2 && !strcmp(argv[1],"-a")){
|
|
||||||
show_about();
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
else if(argc==2 && !strcmp(argv[1],"-h")){
|
|
||||||
show_help();
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
else if(argc==4 && !strcmp(argv[1],"-r")){
|
|
||||||
key_con_read(argv[2]);
|
|
||||||
key_write_in_file(argv[3]);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
printf(INVALID_ARG);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user