Subversion Repositories HelenOS

Rev

Rev 4492 | Rev 4509 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4492 Rev 4508
Line 40... Line 40...
40
#include <bool.h>
40
#include <bool.h>
41
#include <malloc.h>
41
#include <malloc.h>
42
#include <io/klog.h>
42
#include <io/klog.h>
43
#include <vfs/vfs.h>
43
#include <vfs/vfs.h>
44
#include <ipc/devmap.h>
44
#include <ipc/devmap.h>
-
 
45
#include <libadt/list.h>
45
 
46
 
46
FILE stdin_null = {
47
static FILE stdin_null = {
47
    .fd = -1,
48
    .fd = -1,
48
    .error = true,
49
    .error = true,
49
    .eof = true,
50
    .eof = true,
50
    .klog = false,
51
    .klog = false,
51
    .phone = -1
52
    .phone = -1
52
};
53
};
53
 
54
 
54
FILE stdout_klog = {
55
static FILE stdout_klog = {
55
    .fd = -1,
56
    .fd = -1,
56
    .error = false,
57
    .error = false,
57
    .eof = false,
58
    .eof = false,
58
    .klog = true,
59
    .klog = true,
59
    .phone = -1
60
    .phone = -1
60
};
61
};
61
 
62
 
-
 
63
static FILE stderr_klog = {
-
 
64
    .fd = -1,
-
 
65
    .error = false,
-
 
66
    .eof = false,
-
 
67
    .klog = true,
-
 
68
    .phone = -1
-
 
69
};
-
 
70
 
-
 
71
FILE *stdin = NULL;
-
 
72
FILE *stdout = NULL;
-
 
73
FILE *stderr = NULL;
-
 
74
 
-
 
75
static LIST_INITIALIZE(files);
-
 
76
 
-
 
77
void stdio_init(int filc, fdi_node_t *filv[])
-
 
78
{
-
 
79
    if (filc > 0) {
-
 
80
        stdin = fopen_node(filv[0], "r");
-
 
81
    } else {
62
FILE *stdin = &stdin_null;
82
        stdin = &stdin_null;
-
 
83
        list_append(&stdin->link, &files);
-
 
84
    }
-
 
85
   
-
 
86
    if (filc > 1) {
-
 
87
        stdout = fopen_node(filv[1], "w");
-
 
88
    } else {
63
FILE *stdout = &stdout_klog;
89
        stdout = &stdout_klog;
-
 
90
        list_append(&stdout->link, &files);
-
 
91
    }
-
 
92
   
-
 
93
    if (filc > 2) {
-
 
94
        stderr = fopen_node(filv[2], "w");
-
 
95
    } else {
64
FILE *stderr = &stdout_klog;
96
        stderr = &stderr_klog;
-
 
97
        list_append(&stderr->link, &files);
-
 
98
    }
-
 
99
}
-
 
100
 
-
 
101
void stdio_done(void)
-
 
102
{
-
 
103
    link_t *link = files.next;
-
 
104
   
-
 
105
    while (link != &files) {
-
 
106
        FILE *file = list_get_instance(link, FILE, link);
-
 
107
        fclose(file);
-
 
108
        link = files.next;
-
 
109
    }
-
 
110
}
65
 
111
 
66
static bool parse_mode(const char *mode, int *flags)
112
static bool parse_mode(const char *mode, int *flags)
67
{
113
{
68
    /* Parse mode except first character. */
114
    /* Parse mode except first character. */
69
    const char *mp = mode;
115
    const char *mp = mode;
Line 139... Line 185...
139
    stream->error = false;
185
    stream->error = false;
140
    stream->eof = false;
186
    stream->eof = false;
141
    stream->klog = false;
187
    stream->klog = false;
142
    stream->phone = -1;
188
    stream->phone = -1;
143
   
189
   
-
 
190
    list_append(&stream->link, &files);
-
 
191
   
144
    return stream;
192
    return stream;
145
}
193
}
146
 
194
 
147
FILE *fopen_node(fdi_node_t *node, const char *mode)
195
FILE *fopen_node(fdi_node_t *node, const char *mode)
148
{
196
{
Line 167... Line 215...
167
    stream->error = false;
215
    stream->error = false;
168
    stream->eof = false;
216
    stream->eof = false;
169
    stream->klog = false;
217
    stream->klog = false;
170
    stream->phone = -1;
218
    stream->phone = -1;
171
   
219
   
-
 
220
    list_append(&stream->link, &files);
-
 
221
   
172
    return stream;
222
    return stream;
173
}
223
}
174
 
224
 
175
int fclose(FILE *stream)
225
int fclose(FILE *stream)
176
{
226
{
Line 182... Line 232...
182
        ipc_hangup(stream->phone);
232
        ipc_hangup(stream->phone);
183
   
233
   
184
    if (stream->fd >= 0)
234
    if (stream->fd >= 0)
185
        rc = close(stream->fd);
235
        rc = close(stream->fd);
186
   
236
   
-
 
237
    list_remove(&stream->link);
-
 
238
   
-
 
239
    if ((stream != &stdin_null)
187
    if ((stream != &stdin_null) && (stream != &stdout_klog))
240
        && (stream != &stdout_klog)
-
 
241
        && (stream != &stderr_klog))
188
        free(stream);
242
        free(stream);
189
   
243
   
190
    stream = NULL;
244
    stream = NULL;
191
   
245
   
192
    if (rc != 0) {
246
    if (rc != 0) {
Line 351... Line 405...
351
    }
405
    }
352
   
406
   
353
    return -1;
407
    return -1;
354
}
408
}
355
 
409
 
356
void fnode(FILE *stream, fdi_node_t *node)
410
int fnode(FILE *stream, fdi_node_t *node)
357
{
411
{
358
    if (stream->fd >= 0) {
412
    if (stream->fd >= 0)
359
        fd_node(stream->fd, node);
413
        return fd_node(stream->fd, node);
360
    } else {
-
 
361
        node->fs_handle = 0;
-
 
362
        node->dev_handle = 0;
-
 
363
        node->index = 0;
-
 
364
    }
414
   
-
 
415
    return ENOENT;
365
}
416
}
366
 
417
 
367
/** @}
418
/** @}
368
 */
419
 */