Use macros to allow prefixing C runtime library symbols
[monolithium.git] / libraries / mlcrt / src / wd.c
1 /*
2  * wc.c
3  *
4  * Copyright (C) 2019 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 <mlcrt.h>
21 #include <unistd.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <monolithium.h>
25
26 handle_t __CRT_PRIVATE(get_raw_handle)(int fd);
27
28 static char *wd_path = NULL;
29
30 char *__CRT_PUBLIC(getcwd)(char *buf, size_t size)
31 {
32     return __CRT_PUBLIC(strncpy)(buf, wd_path, size);
33 }
34
35 char *__CRT_PUBLIC(getwd)(char *buf)
36 {
37     return __CRT_PUBLIC(strcpy)(buf, wd_path);
38 }
39
40 char *__CRT_PUBLIC(get_current_dir_name)(void)
41 {
42     return __CRT_PUBLIC(strdup)(wd_path);
43 }
44
45 int __CRT_PUBLIC(fchdir)(int fd)
46 {
47     char path[MAX_PATH];
48     handle_t handle = __CRT_PRIVATE(get_raw_handle)(fd);
49
50     sysret_t ret = syscall_query_file(handle, FILE_INFO_NAME, path, sizeof(path));
51
52     if (ret != ERR_SUCCESS)
53     {
54         switch (ret)
55         {
56         case ERR_FORBIDDEN:
57             __CRT_PUBLIC(errno) = EACCES;
58
59         default:
60             __CRT_PUBLIC(errno) = __CRT_PRIVATE(translate_error)(ret);
61         }
62
63         return -1;
64     }
65
66     if (wd_path)
67     {
68         __CRT_PUBLIC(free)(wd_path);
69         wd_path = NULL;
70     }
71
72     wd_path = __CRT_PUBLIC(strdup)(path);
73     return 0;
74 }
75
76 int __CRT_PUBLIC(chdir)(const char *path)
77 {
78     int fd = __CRT_PUBLIC(open)(path, O_RDONLY, 0);
79     if (fd < 0) return -1;
80
81     int ret = __CRT_PUBLIC(fchdir)(fd);
82     __CRT_PUBLIC(close)(fd);
83     return ret;
84 }