ed0029a2fcc639b0523ffa20b38af20e37ebe6aa
[monolithium.git] / libraries / mlcrt / src / wd.c
1 /*
2  * wc.c
3  *
4  * Copyright (C) 2017 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
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 Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <unistd.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <monolithium.h>
24
25 handle_t __crt_get_raw_handle(int fd);
26
27 static char *wd_path = NULL;
28
29 char *getcwd(char *buf, size_t size)
30 {
31     return strncpy(buf, wd_path, size);
32 }
33
34 char *getwd(char *buf)
35 {
36     return strcpy(buf, wd_path);
37 }
38
39 char *get_current_dir_name(void)
40 {
41     return strdup(wd_path);
42 }
43
44 int fchdir(int fd)
45 {
46     char path[MAX_PATH];
47     handle_t handle = __crt_get_raw_handle(fd);
48
49     sysret_t ret = syscall_query_file(handle, FILE_INFO_NAME, path, sizeof(path));
50
51     if (ret != ERR_SUCCESS)
52     {
53         switch (ret)
54         {
55         case ERR_FORBIDDEN:
56             errno = EACCES;
57
58         default:
59             errno = __crt_translate_error(ret);
60         }
61
62         return -1;
63     }
64
65     if (wd_path)
66     {
67         free(wd_path);
68         wd_path = NULL;
69     }
70
71     wd_path = strdup(path);
72     return 0;
73 }
74
75 int chdir(const char *path)
76 {
77     int fd = open(path, O_RDONLY, 0);
78     if (fd < 0) return -1;
79
80     int ret = fchdir(fd);
81     close(fd);
82     return ret;
83 }