3904367530953ae3fa79b2f273fd5d20881cc61c
[akaros.git] / user / apps / parlib / run_binary.c
1 #include <string.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <fcntl.h>
6 #include <stdint.h>
7 #include <stdio.h>
8 #include <unistd.h>
9 #include <parlib.h>
10
11 extern char * readline(const char *prompt);
12
13 #define READ_SIZE       1024
14 uint8_t* binary_buf;
15
16 static void fd_error() {
17         fprintf(stderr, "Error: Unable to run remote binary (fd error): %s\n", strerror(errno));
18 }
19
20 static void malloc_error() {
21         fprintf(stderr, "Error: Unable to run remote binary: No more memory avaialable!\n");
22 }
23
24 static void read_error(void* buf, int fd) {
25         free(binary_buf);
26         close(fd);
27         fprintf(stderr, "Error: Unable to run remote binary (read error): %s\n", strerror(errno));
28 }
29
30 static void realloc_error(void* buf, int fd) {
31         free(binary_buf);
32         close(fd);
33         fprintf(stderr, "Error: Unable to run remote binary: No more memory available!\n");
34 }
35
36 void run_binary()
37 {       
38         char * readline_result = readline("\nEnter name of binary to execute: ");
39         if (readline_result == NULL) {
40                 printf("Error reading from console.\n");
41                 return;
42         }
43
44         char * file_name = malloc(strlen(readline_result) + 8);
45         sprintf(file_name, "./apps/%s", readline_result);
46         int fd = open(file_name, O_RDONLY, 0);
47         if(fd < 0) { fd_error(); return; };
48         
49         int iters = 1;
50         binary_buf = malloc(READ_SIZE);
51         if(binary_buf == NULL) { malloc_error(); return; }
52         
53         int total_bytes_read = 0;
54         int bytes_read = read(fd, binary_buf, READ_SIZE);
55         if(bytes_read < 0) { read_error(binary_buf, fd); return; }
56         
57         while(bytes_read > 0) {
58                 total_bytes_read += bytes_read; 
59                 void* temp_buf = realloc(binary_buf, READ_SIZE*(++iters));
60                 if(temp_buf == NULL) { realloc_error(binary_buf, fd); return; } 
61                 binary_buf = temp_buf;
62                 bytes_read = read(fd, binary_buf+total_bytes_read, READ_SIZE);
63                 if(bytes_read < 0) { read_error(binary_buf, fd); return; }
64         }
65         printf("Loading Binary: %s, ROMSIZE: %d\n", readline_result, total_bytes_read);
66         ssize_t error = sys_run_binary(binary_buf, NULL, total_bytes_read);
67         if(error < 0) {
68                 fprintf(stderr, "Error: Unable to run remote binary\n");
69         }
70         free(binary_buf);
71         close(fd);
72
73 }
74