Implement working directories in the CRT (and a bit of kernel support)
authorcoderain <coderain@sdf.org>
Sat, 28 Oct 2017 21:35:54 +0000 (23:35 +0200)
committercoderain <coderain@sdf.org>
Sat, 28 Oct 2017 21:35:54 +0000 (23:35 +0200)
crt/include/errno.h
crt/include/unistd.h [new file with mode: 0644]
crt/src/wd.c [new file with mode: 0644]
sdk/process.h

index 67899ac4246fd394f98d57fe791b95b37854ebee..c0ffe70560d5e71a570ad0f1e2a36e326347d753 100644 (file)
@@ -64,6 +64,7 @@
 #define ECANCELED    43
 #define ETIMEDOUT    44
 #define ETOOSMALL    45
+#define EOVERFLOW    46
 
 extern int errno;
 
diff --git a/crt/include/unistd.h b/crt/include/unistd.h
new file mode 100644 (file)
index 0000000..a1f1b8a
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * unistd.h
+ *
+ * Copyright (C) 2017 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _UNISTD_H_
+#define _UNISTD_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#define PATH_MAX 16384
+
+#define STDIN_FILENO  0
+#define STDOUT_FILENO 1
+#define STDERR_FILENO 2
+
+#define O_RDONLY   0
+#define O_WRONLY   1
+#define O_RDWR     2
+#define O_CREAT    (1 << 6)
+#define O_EXCL     (1 << 7)
+#define O_TRUNC    (1 << 9)
+#define O_APPEND   (1 << 10)
+#define O_NONBLOCK (1 << 11)
+
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+
+typedef uint16_t mode_t;
+
+typedef ptrdiff_t off_t;
+typedef ptrdiff_t ssize_t;
+
+char *getcwd(char *buf, size_t size);
+char *getwd(char *buf);
+char *get_current_dir_name(void);
+int fchdir(int fd);
+int chdir(const char *path);
+
+#ifndef __DONT_DEFINE_OPEN__
+int open(const char *pathname, int flags, ...);
+#endif
+
+int creat(const char *pathname, mode_t mode);
+int close(int fd);
+ssize_t read(int fd, void *buf, size_t count);
+ssize_t write(int fd, const void *buf, size_t count);
+off_t lseek(int fd, off_t offset, int whence);
+
+#endif
diff --git a/crt/src/wd.c b/crt/src/wd.c
new file mode 100644 (file)
index 0000000..ed0029a
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * wc.c
+ *
+ * Copyright (C) 2017 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <monolithium.h>
+
+handle_t __crt_get_raw_handle(int fd);
+
+static char *wd_path = NULL;
+
+char *getcwd(char *buf, size_t size)
+{
+    return strncpy(buf, wd_path, size);
+}
+
+char *getwd(char *buf)
+{
+    return strcpy(buf, wd_path);
+}
+
+char *get_current_dir_name(void)
+{
+    return strdup(wd_path);
+}
+
+int fchdir(int fd)
+{
+    char path[MAX_PATH];
+    handle_t handle = __crt_get_raw_handle(fd);
+
+    sysret_t ret = syscall_query_file(handle, FILE_INFO_NAME, path, sizeof(path));
+
+    if (ret != ERR_SUCCESS)
+    {
+        switch (ret)
+        {
+        case ERR_FORBIDDEN:
+            errno = EACCES;
+
+        default:
+            errno = __crt_translate_error(ret);
+        }
+
+        return -1;
+    }
+
+    if (wd_path)
+    {
+        free(wd_path);
+        wd_path = NULL;
+    }
+
+    wd_path = strdup(path);
+    return 0;
+}
+
+int chdir(const char *path)
+{
+    int fd = open(path, O_RDONLY, 0);
+    if (fd < 0) return -1;
+
+    int ret = fchdir(fd);
+    close(fd);
+    return ret;
+}
index d1fc912c79100402519486ade4d63ac567862da5..8779f061588a5627df9c690edff7731fc304ab93 100644 (file)
@@ -43,6 +43,7 @@ typedef enum
 typedef struct
 {
     char *command_line;
+    char *working_directory;
     handle_t standard_input;
     handle_t standard_output;
     handle_t standard_error;