1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUF 4*1024
void * fd_to_memory(int fd, unsigned long * length)
{
void *ptr1;
unsigned long size_alloc, size_read;
unsigned long i;
ptr1 = malloc(size_alloc = (BUF+sizeof(unsigned long)));
if (!ptr1) {
fprintf(stderr, "Not enough memory\n");
return NULL;
}
size_read = i = read(fd, ptr1, BUF);
while(i > 0) {
if ((size_alloc - size_read) < BUF) {
ptr1 = realloc(ptr1, size_alloc+=BUF);
if (!ptr1) {
fprintf(stderr, "Not enough memory\n");
return NULL;
}
}
i = read(fd, ptr1+size_read, BUF);
size_read += i;
}
if (i>=0) {
ptr1 = realloc(ptr1, size_read);
*length = size_read;
return ptr1;
} else {
perror("read");
return NULL;
}
}
#ifdef STANDALONE
void main(void)
{
void * ptr;
unsigned long length;
ptr = fd_to_memory(0, &length);
fprintf(stderr, "Length: %lu\n", length);
write(1, ptr, length);
}
#endif
|