Merge commit 'origin/master' into pipes
[ZeXOS.git] / kernel / lib / stdio / write.c
blob64790ec966e7c4a6d866aa9c6641a18525ab6a63
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>
28 #include <fd.h>
30 /* TODO: flags */
31 int write (unsigned fd, void *buf, unsigned len)
33 fd_t *d = fd_get (fd);
35 if (!d)
36 return 0;
38 char *file = dir[d->index].name;
40 if (!file) {
41 DPRINT ("write () -> !file\n");
42 return 0;
45 unsigned file_len = strlen (file);
47 /* create file when not exist */
48 if (d->flags & O_CREAT) {
49 vfs_touch ((char *) file, file_len);
52 memcpy (d->s, (char *) buf, len);
53 d->s[len] = '\0';
55 if (!d->e) {
56 if (!vfs_mmap (file, file_len, buf, len))
57 return 0;
58 } else {
59 DPRINT ("write () - !d->e not implemented - O_APPEND..\n");
60 return 0;
63 d->e += len;
65 return 1;