aboutsummaryrefslogtreecommitdiffstats
path: root/ihe.c
diff options
context:
space:
mode:
authorFreeArtMan <=>2016-02-04 23:02:20 +0000
committerFreeArtMan <=>2016-02-04 23:02:20 +0000
commitebe6923b17de88d37d97846be2567fb75f53292c (patch)
treeca14f19a6634546d93a02775b407e8197c805760 /ihe.c
downloadihe-ebe6923b17de88d37d97846be2567fb75f53292c.tar.gz
ihe-ebe6923b17de88d37d97846be2567fb75f53292c.zip
Initial commit
Diffstat (limited to 'ihe.c')
-rw-r--r--ihe.c569
1 files changed, 569 insertions, 0 deletions
diff --git a/ihe.c b/ihe.c
new file mode 100644
index 0000000..d838b5c
--- /dev/null
+++ b/ihe.c
@@ -0,0 +1,569 @@
+#include "ihe.h"
+#include "cmd.h"
+#include "core.h"
+
+static int cmd_loop = 1;
+extern cmd_table tab[];
+
+/*
+ GLOBAL VARIABLES
+ */
+static file_t *g_file = NULL;
+static buf_t *g_buf = NULL;
+static int g_flags = FD_RW;
+
+
+int c_version(cmd_arg *arg)
+{
+ int argc = arg->argc;
+
+ if ( argc != 0 )
+ {
+ printf("Command should not have arguments mister\n");
+ return -1;
+ }
+
+ printf("Version 0.0.1\n");
+
+ return 0;
+}
+
+
+int c_arg( cmd_arg *arg )
+{
+ int i;
+ int argc = arg->argc;
+ char **argv = arg->argv;
+
+ for (i=0;i<argc;i++)
+ {
+ printf("arg %d: val :%s\n", i, argv[i]);
+ }
+
+ return 0;
+}
+
+
+int c_quit( cmd_arg *arg )
+{
+ cmd_loop = 0;
+ return 0;
+}
+
+
+int c_help( cmd_arg *arg )
+{
+ int i = 0;
+ printf("Command list\n");
+ while ( tab[i].cmd != NULL )
+ {
+ printf("%s - \n", tab[i].cmd);
+ i++;
+ }
+ return 0;
+}
+
+
+/*
+OPEN <FILENAME>
+*/
+int c_open( cmd_arg *arg )
+{
+
+ int argc = arg->argc;
+ char **argv = arg->argv;
+ char *fname = NULL;
+ int fret = 0;
+
+ if ( argc != 1 )
+ {
+ printf("Neeed one argument\n");
+ return -1;
+ }
+
+ fname = argv[0];
+
+ fret = file_open_fn( g_file, fname, g_flags ); //!if failure fields could be non empty inside struct
+ if ( fret < 0 )
+ {
+ printf("Cannot open file %s\n",fname);
+ return -1;
+ }
+
+
+
+ return 0;
+}
+
+
+/*
+CLOSE
+*/
+int c_close( cmd_arg *arg )
+{
+ int fret = 0;
+
+ fret = file_close( g_file );
+ if ( fret != 0 )
+ {
+ printf("Cannot close file\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+FILE
+*/
+int c_info( cmd_arg *arg )
+{
+
+ if ( g_file == NULL )
+ {
+ printf("no opened files\n");
+ } else
+ {
+ printf("FILE INFO:\n");
+ printf("NAME : %s\n", g_file->filename );
+ printf("FD : %d\n", g_file->fd );
+ printf("FLAGS : 0x%08x\n", g_file->flags );
+ printf("MODE : 0x%08x\n", g_file->mode );
+ printf("OFFSET : %zd\n", g_file->offset );
+ printf("POSITION: %d\n", g_file->position );
+ printf("SIZE : %zd\n", g_file->size );
+ printf("BLOCK : %u\n", g_file->blk_size );
+ }
+
+ if ( g_buf == NULL )
+ {
+ printf("buffer not initialised\n");
+ } else
+ {
+ printf("BUF:\n");
+ printf("ADDR : %08x\n", g_buf->buf);
+ printf("SIZE : %d\n", g_buf->size);
+ printf("BUFSIZE: %d\n", g_buf->buf_size);
+ }
+
+ return 0;
+}
+
+
+int c_seek( cmd_arg *arg )
+{
+ int fret;
+ int argc = arg->argc;
+ char **argv = arg->argv;
+ off_t offset;
+
+ if (argc != 1)
+ {
+ printf("One argument needed\n");
+ return -1;
+ }
+
+ if (g_file->fd == 0)
+ {
+ printf("File descriptor not set\n");
+ return -1;
+ }
+
+ offset = atoi( argv[0] ); //!fix that to strtol at least
+ fret = file_seek( g_file, offset );
+ if ( fret != 0 )
+ {
+ printf("Cannot seek postion to %zd\n", offset);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int c_pos( cmd_arg *arg )
+{
+ int fret = 0;
+
+ fret = file_pos( g_file );
+ if ( fret < 0)
+ {
+ printf("Cannot get file position\n");
+ return -1;
+ }
+
+ printf("POS:%d\n",fret);
+
+ return 0;
+}
+
+
+int c_size( cmd_arg *arg )
+{
+ off_t size;
+
+ size = file_size( g_file );
+ if ( size < 0 )
+ {
+ printf("Cannot get file size\n");
+ return -1;
+ }
+
+ printf("File size %zu\n", size);
+
+ return 0;
+}
+
+
+int c_blk( cmd_arg *arg )
+{
+ printf("FILE BLOCK SIZE %u\n", g_file->blk_size );
+ printf("BUFFER BLOCK SIZE %d (MAX %d)\n", g_buf->size, g_buf->buf_size );
+
+ return 0;
+}
+
+
+int c_read( cmd_arg *arg )
+{
+ int ret;
+
+ if ( g_buf->buf == NULL )
+ {
+ printf("Buffer mem not allocated\n");
+ return -1;
+ }
+
+ ret = file_read_blk( g_file, g_buf->buf );
+ printf("Readed %d bytes\n", ret);
+ if ( (ret >= 0) && (ret <= g_buf->buf_size) )
+ {
+ g_buf->size = ret;
+ }
+
+ return 0;
+}
+
+
+int c_dump( cmd_arg *arg )
+{
+ int i;
+
+ if ( g_buf->buf == NULL)
+ {
+ printf("Buffer to print empty\n");
+ return -1;
+ }
+
+ for (i=0; i<g_buf->size; i++)
+ {
+ printf("%02x",(unsigned char)g_buf->buf[i]);
+ }
+ printf("\n");
+
+ return 0;
+}
+
+
+int c_dumpx( cmd_arg *arg )
+{
+ int i,j;
+
+ if ( g_buf->buf == NULL)
+ {
+ printf("Buffer to print empty\n");
+ return -1;
+ }
+
+ for (i=0; i<g_buf->size; i+=16)
+ {
+ for (j=i; j<i+16; j++)
+ {
+ if ( j<g_buf->size )
+ {
+ printf("%02x ",(unsigned char)g_buf->buf[j]);
+ } else
+ {
+ printf(" ");
+ }
+ }
+
+ for (j=i; j<i+16; j++)
+ {
+ if ( j<g_buf->size ) //wrong place move to cycle?
+ {
+ if ( isprint(g_buf->buf[j]) )
+ {
+ printf("%c",(unsigned char)g_buf->buf[j]);
+ } else
+ {
+ printf("\e[7m.\e[0m");
+ }
+ }
+ }
+ printf("\n");
+ }
+ printf("\n");
+
+ return 0;
+}
+
+
+//support masks
+int c_write( cmd_arg *arg )
+{
+ /*
+ anonymous function
+ */
+ uint8_t hex2u8( uint8_t *buf )
+ {
+ uint8_t ret = 0x00;
+ unsigned long int uli;
+ char str[3];
+ str[0] = buf[0];
+ str[1] = buf[1];
+ str[2] = 0;
+
+ uli = strtoul( str, NULL, 16 );
+
+ ret = uli;
+
+ return ret;
+ }
+
+ int argc = arg->argc;
+ char **argv = arg->argv;
+ int i;
+ uint8_t *buf = NULL;
+ int fret;
+
+ if ( argc != 1 )
+ {
+ printf("One argument needed\n");
+ return -1;
+ }
+
+ if ( (strlen(argv[0])%2) != 0 )
+ {
+ printf("Input string should be ( str mod 2 == 0) \n");
+ return -1;
+ }
+
+ for (i=0;i<strlen(argv[0]);i++)
+ {
+ if ( !isxdigit(argv[0][i]) )
+ {
+ printf("CH %c not hexlike at pos %d\n", argv[0][i], i);
+ return -1;
+ }
+ }
+
+ if (strlen(argv[0]) > g_buf->size*2)
+ {
+ printf("Input param bigger then buffer\n");
+ return -1;
+ }
+
+
+ for (i=0; i<strlen(argv[0]); i+=2)
+ {
+ printf("%02x ",hex2u8(&argv[0][i]));
+ }
+ printf("\n");
+
+
+ buf = malloc(strlen(argv[0])/2);
+ for (i=0; i<(strlen(argv[0])/2); i++)
+ {
+ buf[i] = hex2u8(&argv[0][i*2]);
+ }
+
+ memcpy( g_buf->buf, buf, strlen(argv[0])/2 );
+ fret = file_write_blk( g_file, g_buf->buf );
+ free( buf );
+
+ if ( fret < 0)
+ {
+ printf("Couldnt write block to file\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+//white spaces should be supported
+int c_writes( cmd_arg *arg )
+{
+ int argc = arg->argc;
+ char **argv = arg->argv;
+ int fret = 0;
+
+ if ( argc != 1)
+ {
+ printf("Need one argument mister\n");
+ return -1;
+ }
+
+ if (((g_buf == NULL) || (g_file == NULL)) || (g_buf->buf == NULL))
+ {
+ printf("Buffer or file not initialised");
+ return -1;
+ }
+
+ if ( strlen(argv[0]) <= g_buf->size )
+ {
+ memcpy( g_buf->buf, argv[0], strlen(argv[0]) );
+ fret = file_write_blk( g_file, g_buf->buf );
+ if ( fret < 0 )
+ {
+ printf("Couldnt write block to file\n");
+ return -1;
+ }
+ } else
+ {
+ printf("Input bigger then buffer buf %d input %d\n", g_buf->size, strlen(argv[0]));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int c_flags( cmd_arg *arg )
+{
+ int argc = arg->argc;
+ char **argv = arg->argv;
+
+ if ( argc == 0 )
+ {
+ printf("FLAGS: 0x%08x\n", g_flags );
+ return 0;
+ }
+
+ if ( argc > 1 )
+ {
+ printf("Only one argument needed\n");
+ return -1;
+ }
+
+ if ( strncmp(argv[0],"R",2) == 0 )
+ {
+ g_flags = FD_RO;
+ } else if ( strncmp(argv[0],"W",2) == 0 )
+ {
+ g_flags = FD_WO;
+ } else if ( strncmp(argv[0],"RW",3) == 0 )
+ {
+ g_flags = FD_RW;
+ } else
+ {
+ printf("Unknown mode. Suported R/W/RW\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int c_manifesto( cmd_arg *arg )
+{
+ printf("""\
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\
++ MANIFESTO +\n\
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\
++ 1. All hardware and software that you are owner of belongs to you no software+\n\
++ neither hardware patents can stop you to reverse engineer your property. +\n\
++ Software/Hardware that you are owning should be obtained in legal way +\n\
++ except situation under chapter 7 +\n\
++ 2. Any license or patent that disagree with that is unlawfull as it against +\n\
++ to personal freedomes. +\n\
++ 3. Any compiled or non compiled code on your device is your property. +\n\
++ 4. This software is made for any kind of knowledge gaining about software or +\n\
++ hardware that are belong to you. No commercial distribution of gained +\n\
++ knowledge should be made. Only free knowledge distribution allowed. +\n\
++ 5. This software should not be used to harm any living been this doesnt apply+\n\
++ to intelectual property of any kind. With this software personal info like+\n\
++ adresses, credit cards numbers, names, surnames, passwords should not be +\n\
++ gained as it may harm living beans that owns them and surands them. +\n\
++ 6. This software is made to explore system, gain understanding of system and +\n\
++ protect from system. +\n\
++ 7. This software may be used even if any patented or licensed +\n\
++ hardware/software is used in hardware or software that may treat human +\n\
++ life (rockets, warships, missles, army robots, electronics optical +\n\
++ devices, guns, SCADA malware and so on) physicaly doesnt belong to this +\n\
++ software user but treatening this software user life. +\n\
++ 8. By using this software you take all responsibity of result that may occure+\n\
++ while you use it on yourself. +\n\
++ 9. THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+\n\
++ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +\n\
++ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +\n\
++ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+\n\
++ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +\n\
++ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +\n\
++ DEALINGS IN THE SOFTWARE. +\n\
++ 10. If you disagree with any point that mentioned here please stop using this+\n\
++ peace of software. +\n\
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\
+""");
+ return 0;
+}
+
+/*
+CMD COMMANDS
+*/
+cmd_table tab[] = {
+ {"version", c_version },
+ {"arg", c_arg },
+ {"quit", c_quit},
+ {"help", c_help},
+ {"?", c_help},
+ {"open", c_open},
+ {"close", c_close},
+ {"info", c_info},
+ {"seek", c_seek},
+ {"pos", c_pos},
+ {"size", c_size},
+ {"blk", c_blk},
+ {"read", c_read},
+ {"dump", c_dump},
+ {"dumpx", c_dumpx},
+ {"write", c_write},
+ {"writes", c_writes},
+ {"flags", c_flags},
+ {"manifesto", c_manifesto},
+ {NULL, NULL }
+};
+
+
+
+int main( int argc, char **argv )
+{
+ char *cmd = NULL;
+ cmd_arg *tok = NULL;
+
+ //preapre global stuff
+ g_file = file_init();
+
+ //init basic buffer
+ g_buf = buf_init();
+ buf_size( g_buf, DEFAULT_BLK_SIZE );
+
+ //read line from cmd
+ while( cmd_loop )
+ {
+ cmd = cmd_line(NULL);
+ //printf("cmd [%s]\n", cmd);
+ //printf("cnt %d\n",cnt_sep(cmd));
+
+ tok = cmd_parse( cmd );
+ free( cmd );
+
+ cmd_exec( tok, tab );
+
+ cmd_arg_free( tok );
+ }
+
+ return 0;
+} \ No newline at end of file