Add access?
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 16 Apr 2017 07:51:45 +0000 (09:51 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 16 Apr 2017 07:51:45 +0000 (09:51 +0200)
* libc/mlibc.c (access): New function.
* module/mes/libc-i386.mes (i386:access): New function.
  (i386:libc): Add it.
* src/posix.c (access_p): New function.
* module/mes/posix.mes: New file.
* module/mes/base-0.mes (mes): Include it.
* module/mes/read-0-32.mo: Regenerate.

libc/mlibc.c
module/mes/base-0.mes
module/mes/guile.mes
module/mes/libc-i386.mes
module/mes/posix.mes [new file with mode: 0644]
module/mes/read-0-32.mo
src/posix.c

index f74caa349e4e146b9e84a570a5747dc0abb94845..c1ec677cc044e04529772670743c101dcbcbf5be 100644 (file)
@@ -79,60 +79,57 @@ read (int fd, void* buf, size_t n)
 }
 
 int
-open (char const *s, int mode)
+write (int fd, char const* s, int n)
 {
   int r;
-  //syscall (SYS_open, mode));
+  //syscall (SYS_write, fd, s, n));
   asm (
        "mov %1,%%ebx\n\t"
        "mov %2,%%ecx\n\t"
-       "mov $0x5,%%eax\n\t"
+       "mov %3,%%edx\n\t"
+
+       "mov $0x4, %%eax\n\t"
        "int $0x80\n\t"
        "mov %%eax,%0\n\t"
        : "=r" (r)
-       : "" (s), "" (mode)
-       : "eax", "ebx", "ecx"
+       : "" (fd), "" (s), "" (n)
+       : "eax", "ebx", "ecx", "edx"
        );
   return r;
 }
 
-int puts (char const*);
-char const* itoa (int);
-
 int
-write (int fd, char const* s, int n)
+open (char const *s, int mode)
 {
   int r;
-  //syscall (SYS_write, fd, s, n));
+  //syscall (SYS_open, mode));
   asm (
        "mov %1,%%ebx\n\t"
        "mov %2,%%ecx\n\t"
-       "mov %3,%%edx\n\t"
-
-       "mov $0x4, %%eax\n\t"
+       "mov $0x5,%%eax\n\t"
        "int $0x80\n\t"
        "mov %%eax,%0\n\t"
        : "=r" (r)
-       : "" (fd), "" (s), "" (n)
-       : "eax", "ebx", "ecx", "edx"
+       : "" (s), "" (mode)
+       : "eax", "ebx", "ecx"
        );
   return r;
 }
 
 int
-fsync (int fd)
+access (char const *s, int mode)
 {
   int r;
-  //syscall (SYS_fsync, fd));
+  //syscall (SYS_access, mode));
   asm (
        "mov %1,%%ebx\n\t"
-
-       "mov $0x76, %%eax\n\t"
+       "mov %2,%%ecx\n\t"
+       "mov $0x21,%%eax\n\t"
        "int $0x80\n\t"
        "mov %%eax,%0\n\t"
        : "=r" (r)
-       : "" (fd)
-       : "eax", "ebx"
+       : "" (s), "" (mode)
+       : "eax", "ebx", "ecx"
        );
   return r;
 }
@@ -155,6 +152,24 @@ brk (void *p)
   return r;
 }
 
+int
+fsync (int fd)
+{
+  int r;
+  //syscall (SYS_fsync, fd));
+  asm (
+       "mov %1,%%ebx\n\t"
+
+       "mov $0x76, %%eax\n\t"
+       "int $0x80\n\t"
+       "mov %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (fd)
+       : "eax", "ebx"
+       );
+  return r;
+}
+
 int
 fputc (int c, int fd)
 {
index f45c3cea49bce77debf10e51fdbc5b8873980f41..41d20b31c6c1cba11c2de53108ba987111e15704 100644 (file)
 (mes-use-module (srfi srfi-13))
 (mes-use-module (mes display))
 (mes-use-module (mes catch))
+(mes-use-module (mes posix))
index 93171d47c421fc304391ff8c2ecc184e744c5f0e..559c5e68fdf51c75c75abe5e5528557a39847ba6 100644 (file)
      ((eq? c #\*eof*) s)
      (#t (read-string (read-char) (peek-char) (append-char s c)))))
   (list->string (read-string (read-char) (peek-char) (list))))
-
-(define (access? file-name how) #t)
-(define R_OK 0)
index b72a750be1ca4ed6e46a865708cefa9d0be07f46..06baffcc9e681ea3bdb0ed7287c71e3df7187346 100644 (file)
     #xcd #x80                           ; int    $0x80
     ))
 
-(define (i386:open f g ta t d)
+(define (i386:read f g ta t d)
   '(
     #x55                                ; push   %ebp
     #x89 #xe5                           ; mov    %esp,%ebp
 
     #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
     #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
+    #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
 
-    #xb8 #x05 #x00 #x00 #x00            ; mov    $0x5,%eax
+    #xb8 #x03 #x00 #x00 #x00            ; mov    $0x3,%eax
     #xcd #x80                           ; int    $0x80
 
     #xc9                                ; leave
     #xc3                                ; ret
     ))
 
-(define (i386:read f g ta t d)
+(define (i386:write f g ta t d)
   '(
     #x55                                ; push   %ebp
     #x89 #xe5                           ; mov    %esp,%ebp
     #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
     #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
 
-    #xb8 #x03 #x00 #x00 #x00            ; mov    $0x3,%eax
+    #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
     #xcd #x80                           ; int    $0x80
 
     #xc9                                ; leave
     #xc3                                ; ret
     ))
 
-(define (i386:write f g ta t d)
+(define (i386:open f g ta t d)
   '(
     #x55                                ; push   %ebp
     #x89 #xe5                           ; mov    %esp,%ebp
 
     #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
     #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
-    #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
 
-    #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
+    #xb8 #x05 #x00 #x00 #x00            ; mov    $0x5,%eax
+    #xcd #x80                           ; int    $0x80
+
+    #xc9                                ; leave
+    #xc3                                ; ret
+    ))
+
+(define (i386:access f g ta t d)
+  '(
+    #x55                                ; push   %ebp
+    #x89 #xe5                           ; mov    %esp,%ebp
+
+    #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
+    #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
+
+    #xb8 #x21 #x00 #x00 #x00            ; mov    $0x21,%eax
     #xcd #x80                           ; int    $0x80
 
     #xc9                                ; leave
 (define i386:libc
   (list
    (cons "exit" (list i386:exit))
-   (cons "open" (list i386:open))
    (cons "read" (list i386:read))
    (cons "write" (list i386:write))
-   (cons "fsync" (list i386:fsync))
-   (cons "brk" (list i386:brk))))
+   (cons "open" (list i386:open))
+   (cons "access" (list i386:access))
+   (cons "brk" (list i386:brk))
+   (cons "fsync" (list i386:fsync))))
diff --git a/module/mes/posix.mes b/module/mes/posix.mes
new file mode 100644 (file)
index 0000000..e6d5bd0
--- /dev/null
@@ -0,0 +1,25 @@
+;;; -*-scheme-*-
+
+;;; Mes --- Maxwell Equations of Software
+;;; Copyright © 2017 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;
+;;; This file is part of Mes.
+;;;
+;;; Mes is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; Mes 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 General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(define R_OK 0)
index 684bab8724fec5aaf21daf2cc3b091a2fb30024e..efd095e148289a5e0502e3e05b7aa481cf954147 100644 (file)
Binary files a/module/mes/read-0-32.mo and b/module/mes/read-0-32.mo differ
index c583003f4cbb048278b643f57b96da1725f4cddf..3219c06f44d7c3aa1a1d1d3dff01c517e0c9c3e2 100644 (file)
@@ -101,6 +101,12 @@ open_input_file (SCM file_name)
   return MAKE_NUMBER (open (string_to_cstring (file_name), O_RDONLY));
 }
 
+SCM
+access_p (SCM file_name, SCM mode)
+{
+  return access (string_to_cstring (file_name), VALUE (mode)) == 0 ? cell_t : cell_f;
+}
+
 SCM
 current_input_port ()
 {