1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5
6typedef struct _Buffer {
7 char *buff;
8 int room, used;
9} Buffer;
10
11void InitBuffer (Buffer *b);
12void AppendToBuffer (Buffer *b, const char *str, int len);
13void ReadFile (Buffer *buffer, FILE *input);
14
15#define INIT_BUFFER_SIZE 10000
16
17void
18InitBuffer (Buffer *b)
19{
20 b->room = INIT_BUFFER_SIZE;
21 b->used = 0;
22 b->buff = (char *)malloc(INIT_BUFFER_SIZE*sizeof(char));
23}
24
25void
26AppendToBuffer (Buffer *b, const char *str, int len)
27{
28 while (b->used + len > b->room) {
29 b->buff = (char *)realloc(ptr: b->buff, size: 2*b->room*(sizeof(char)));
30 b->room *= 2;
31 }
32 strncpy(b->buff + b->used, str, len);
33 b->used += len;
34}
35
36void
37ReadFile (Buffer *buffer, FILE *input)
38{
39 char buf[BUFSIZ + 1];
40 int bytes;
41
42 buffer->used = 0;
43 while (!feof(stream: input) && (bytes = fread(ptr: buf, size: 1, BUFSIZ, stream: input)) > 0) {
44 AppendToBuffer(b: buffer, str: buf, len: bytes);
45 }
46 AppendToBuffer(b: buffer, str: "", len: 1);
47}
48
49int
50main(int argc, char *argv[])
51{
52 char filename[] = "xbug.c";
53 FILE *input;
54 Buffer buffer;
55
56 InitBuffer(b: &buffer);
57
58 if (!freopen (filename: filename, modes: "r", stdin))
59 fprintf(stderr, "cannot open file\n");
60
61 unsetenv (name: "LD_LIBRARY_PATH");
62
63 if (!(input = popen(command: "/bin/cat", modes: "r")))
64 fprintf(stderr, "cannot run \n");
65
66 ReadFile(buffer: &buffer, input);
67 pclose(stream: input);
68
69 return 0;
70}
71

source code of glibc/stdio-common/xbug.c