Cleanup in elf.c with .bss section clean; adm command mounts cdrom instead of floppy...
[ZeXOS.git] / kernel / lib / stdio / open.c
blob485f601fdc87ea8f768f7d6d3239c6bc133678ee
1 /*
2 * ZeX/OS
3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
5 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include <system.h>
23 #include <string.h>
24 #include <stdio.h>
25 #include <file.h>
26 #include <mount.h>
27 #include <env.h>
28 #include <vfs.h>
29 #include <dev.h>
30 #include <fd.h>
31 #include <errno.h>
32 #include <cache.h>
34 int open (const char *pathname, int flags)
36 fd_t *fd = fd_create (flags);
38 if (!fd) {
39 DPRINT (DBG_LIB | DBG_STDIO, "open () -> !fd");
40 return -1; /* fd_create sets errno */
43 unsigned fi_len = strlen (pathname);
45 if (!fi_len) {
46 DPRINT (DBG_LIB | DBG_STDIO, "open () -> !fi_len");
47 return 0;
50 /* cache_t *cache = 0;
52 if (flags & O_RDONLY) {
53 int ret = vfs_read ((char *) pathname, fi_len);
55 if (ret < 0) {
56 DPRINT (DBG_LIB | DBG_STDIO, "fd -> %d : file '%s' not found!", fd->id, pathname);
57 errno_set (ENOENT);
58 return -1;
61 i = (unsigned char) ret;
63 cache = cache_read ();
66 if (flags & O_WRONLY) {
67 fd->e = 0;
69 unsigned y;
70 for (y = 0; y < 235; y ++) {
71 if (!dir[y].name[0]) {
72 i = y;
73 memcpy (dir[y].name, pathname, fi_len);
74 dir[y].name[fi_len] = '\0';
75 break;
78 printf ("jo\n");
79 cache = cache_create (0, 0, 0);
82 if (!cache) {
83 errno_set (ENOMEM);
84 return -1;
87 kprintf ("fd->e %d | b: %s\n", cache->limit, (char *) &cache->data);
89 fd->e = cache->limit;
91 fd->s = (char *) &cache->data;*/
92 fd->e = 0;
93 fd->s = 0;
94 fd->p = 0;
96 fd->path = kmalloc (fi_len + 1);
98 if (!fd->path)
99 return -1;
101 memcpy (fd->path, pathname, fi_len);
102 fd->path[fi_len] = '\0';
104 fd->dev = dev_find ((char *) pathname);
106 if (flags & O_RDONLY || flags & O_RDWR) {
107 vfs_content_t content;
108 int ret = vfs_read ((char *) fd->path, fi_len, &content);
110 if (ret < 0) {
111 DPRINT (DBG_LIB | DBG_STDIO, "fd -> %d : file '%s' not found!", fd->id, fd->path);
112 errno_set (ENOENT);
113 return -1;
116 fd->s = content.ptr;
117 fd->e = content.len;
120 return fd->id;