From 2d126cde8a31ec79d7c728cecbdd8e5b55fc7e08 Mon Sep 17 00:00:00 2001 From: Nicolas Haunold Date: Fri, 14 May 2010 16:15:39 +0200 Subject: Added shell with 'internal' commands using readline. --- Makefile | 6 +++--- src/irecovery.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 228b9c3..70822cd 100644 --- a/Makefile +++ b/Makefile @@ -9,15 +9,15 @@ static: linux: gcc -o libirecovery.o -c src/libirecovery.c -g -I./include -lreadline -fPIC gcc -o libirecovery.so libirecovery.o -g -shared -Wl,-soname,libirecovery.so -lusb-1.0 - gcc -o irecovery src/irecovery.c -g -I./include -L. -lirecovery + gcc -o irecovery src/irecovery.c -g -I./include -L. -lirecovery -lreadline macosx: gcc -o libirecovery.dylib -c src/libirecovery.c -dynamiclib - gcc -o irecovery irecovery.c -I. -lirecovery + gcc -o irecovery irecovery.c -I. -lirecovery -lreadline windows: gcc -o libirecovery.dll -c src/libirecovery.c -I. -lusb-1.0 -lreadline -shared -fPIC - gcc -o irecovery irecovery.c -I. -lirecovery + gcc -o irecovery irecovery.c -I. -lirecovery -lreadline clean: rm -rf irecovery libirecovery.o libirecovery.so libirecovery.a diff --git a/src/irecovery.c b/src/irecovery.c index e2696d9..13d8be1 100644 --- a/src/irecovery.c +++ b/src/irecovery.c @@ -20,11 +20,49 @@ #include #include #include +#include +#include enum { - kResetDevice, kSendCommand, kSendFile + kResetDevice, kStartShell, kSendCommand, kSendFile }; +void print_shell_usage() { + printf("Usage:\n"); + printf("\t:f \tSend file to device.\n"); + printf("\t:h\t\tShow this help.\n"); + printf("\t:q\t\tQuit interactive shell.\n"); +} + +void init_shell(irecv_device* device) { + int ret; + + for(;;) { + char* cmd = readline("iRecovery> "); + if(cmd && *cmd) { + add_history(cmd); + if(cmd[0] == ':') { + strtok(cmd, " "); + char* arg = strtok(0, " "); + + if(cmd[1] == 'q') { + break; + } else if(cmd[1] == 'h') { + print_shell_usage(); + } else if(cmd[1] == 'f') { + ret = irecv_send_file(device, arg); + // TODO: error messages + } + } else { + ret = irecv_send_command(device, cmd); + // TODO: error messages + } + + free(cmd); + } + } +} + void print_usage() { printf("iRecovery - iDevice Recovery Utility\n"); printf("Usage: ./irecovery [args]\n"); @@ -33,6 +71,7 @@ void print_usage() { printf("\t-f \tSend file to device.\n"); printf("\t-h\t\tShow this help.\n"); printf("\t-r\t\tReset device.\n"); + printf("\t-s\t\tStart interactive shell.\n"); exit(1); } @@ -41,7 +80,7 @@ int main(int argc, char** argv) { int action = 0; char* argument = NULL; if(argc == 1) print_usage(); - while ((opt = getopt(argc, argv, "dhrc:f:")) > 0) { + while ((opt = getopt(argc, argv, "dhrsc:f:")) > 0) { switch (opt) { case 'd': irecv_set_debug(1); @@ -55,6 +94,10 @@ int main(int argc, char** argv) { action = kResetDevice; break; + case 's': + action = kStartShell; + break; + case 'c': action = kSendCommand; argument = optarg; @@ -95,6 +138,10 @@ int main(int argc, char** argv) { irecv_send_command(device, argument); break; + case kStartShell: + init_shell(device); + break; + default: fprintf(stderr, "Unknown action\n"); break; -- cgit v1.1-32-gdbae