blob: 9e7c7c6ddd4a6728724a5071e6418586d61b0591 (
plain)
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
52
53
54
55
56
57
58
|
#include <errno.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
// FIXME: All modes not implemented
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdopen.html
FILE *fdopen(int fildes, const char *mode) {
FILE *r = calloc(1, sizeof(FILE));
if (!r) {
errno = -ENOMEM;
return NULL;
}
for (; *mode; mode++) {
// r or rb
// Open file for reading.
// w or wb
// Truncate to zero length or create file for writing.
// a or ab
// Append; open or create file for writing at
// end-of-file.
switch (*mode) {
case 'r':
r->can_read = 1;
break;
case 'w':
r->can_write = 1;
break;
case 'a':
r->append = 1;
break;
}
}
struct stat s;
if (-1 == fstat(fildes, &s)) {
free(r);
errno = -EBADF;
return NULL;
}
r->read = read_fd;
r->write = write_fd;
r->seek = seek_fd;
r->has_error = 0;
r->is_eof = 0;
r->offset_in_file = 0;
r->file_size = s.st_size;
r->cookie = NULL;
r->fd = fildes;
r->read_buffer = NULL;
r->read_buffer_stored = 0;
r->fflush = fflush_fd;
r->has_control_over_the_fd = 0;
return r;
}
|