New release - version 0.6.1; zasm compiler added - ZeX/OS assembly compiler; lot...
[ZeXOS.git] / kernel / lib / stdio / write.c
blob64e242d73a33b7acde17d85fe65cb6829f7397f4
1 /*
2 * ZeX/OS
3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include <system.h>
22 #include <string.h>
23 #include <stdio.h>
24 #include <file.h>
25 #include <mount.h>
26 #include <env.h>
27 #include <vfs.h>
29 extern fd_t fd_list;
31 static fd_t *getbyfd (int id)
33 fd_t *fd;
34 for (fd = fd_list.next; fd != &fd_list; fd = fd->next) {
35 if (fd->id == (unsigned) id)
36 return fd;
39 return 0;
42 /* TODO: flags */
43 int write (unsigned fd, void *buf, unsigned len)
45 fd_t *d = getbyfd (fd);
47 if (!d)
48 return 0;
50 char pwd[64];
51 strcpy (pwd, (char *) env_get ("PWD"));
53 /*partition_t *p = mount_find (pwd);
55 if (!p) {
56 DPRINT ("mount point does not exist !\n");
57 return 0;
58 }*/
60 /*if (!d->index) {
61 DPRINT ("file not found!\n");
62 return 0;
65 char *file = dir[d->index].name;
67 if (!file) {
68 DPRINT ("write () -> !file\n");
69 return 0;
72 unsigned file_len = strlen (file);
74 /* create file when not exist */
75 if (d->flags & O_CREAT) {
76 vfs_touch ((char *) file, file_len);
79 memcpy (d->s, (char *) buf, len);
80 d->s[len] = '\0';
82 if (!d->e) {
83 if (!vfs_mmap (file, file_len, buf, len))
84 return 0;
85 } else {
86 DPRINT ("write () - !d->e not implemented - O_APPEND..\n");
87 return 0;
90 d->e += len;
92 return 1;