sped up run binary... realloc sux
[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 MALLOC_SIZE     1048576
14 #define READ_SIZE       1024
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(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(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         char* file_name = readline_result;
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         //free(file_name);
48         if(fd < 0) { fd_error(); return; };
49         
50         int total_bytes_read = 0;
51         int bytes_read = 0;
52         int bufsz = 0;
53         void* binary_buf = NULL;
54         
55         while(1) {
56                 if(total_bytes_read+READ_SIZE > bufsz)
57                 {
58                         void* temp_buf = realloc(binary_buf,bufsz+MALLOC_SIZE);
59                         if(temp_buf == NULL) { realloc_error(binary_buf, fd); return; }
60                         binary_buf = temp_buf;
61                         bufsz += MALLOC_SIZE;
62                 }
63
64                 bytes_read = read(fd, binary_buf+total_bytes_read, READ_SIZE);
65                 total_bytes_read += bytes_read;
66                 if(bytes_read < 0) { read_error(binary_buf, fd); return; }
67                 if(bytes_read == 0) break;
68         }
69         printf("Loading Binary: %s, ROMSIZE: %d\n", readline_result, total_bytes_read);
70         ssize_t error = sys_run_binary(binary_buf, NULL, total_bytes_read, 0);
71         if(error < 0) {
72                 fprintf(stderr, "Error: Unable to run remote binary\n");
73         }
74         free(binary_buf);
75         close(fd);
76 }
77