Fix minor bugs in linux/sys directory emulation and bin/sh filename globbing
authorNick Downing <downing.nick@gmail.com>
Mon, 30 Jan 2017 13:46:09 +0000 (00:46 +1100)
committerNick Downing <downing.nick@gmail.com>
Mon, 30 Jan 2017 13:46:09 +0000 (00:46 +1100)
bin/sh/Makefile
bin/sh/expand.c
lib/libc/linux/sys/execve.c
lib/libc/linux/sys/linux.c
lib/libc/linux/sys/vopen.c
lib/libc/sys/execl.c
lib/libc/sys/execle.c
lib/libc/sys/exect.c
lib/libc/sys/execv.c
lib/libc/sys/execve.c
sys/h/exec.h

index b733cc6..3745424 100644 (file)
@@ -3,7 +3,7 @@
 OBJS=  args.o blok.o builtin.o cmd.o ctype.o error.o expand.o fault.o io.o \
        macro.o main.o msg.o name.o print.o service.o setbrk.o stak.o \
        string.o word.o xec.o
-CFLAGS = -O -w
+CFLAGS = -O -w -g
 
 all:   sh
 
index c262f23..8aced80 100644 (file)
@@ -74,9 +74,9 @@ int expand(as, rflg) char *as; int rflg; {
                        break;
                }
        }
-       if (stat(s,&statb)>=0
+       if (stat(s == nullstr ? "." : s,&statb)>=0
            && (statb.st_mode&S_IFMT)==S_IFDIR
-           && (dirf=opendir(s)) != NULL) {
+           && (dirf=opendir(s == nullstr ? "." : s)) != NULL) {
                dir++;
        }
        count=0;
index 982d290..0f5d1f2 100644 (file)
@@ -1,7 +1,16 @@
+#include <nox_errno.h>
+#include <nox_stdlib.h>
 #include <nox_unistd.h>
 
+#include <sys/errno.h>
 #include <sys/exec.h>
+#include "linux.h"
 
-void execve(s, v, e) char *s; char *v[]; char *e[]; {
-       nox_execve(s, v, e);
+int execve(s, v, e) char *s; char *v[]; char *e[]; {
+       if (nox_execve(s, v, e)) {
+               errno = htot_errno(nox_errno);
+               return -1;
+       }
+       nox_write((nox_int)2, "execve(): no return\n", 20);
+       nox_abort();
 }
index 56875b5..f0209d6 100644 (file)
@@ -183,18 +183,19 @@ static void htot_direct(dirent, res) struct nox_dirent *dirent; struct direct *r
 }
 
 nox_int htot_dir(fd) nox_int fd; {
-       nox_int res;
-       static char tempfile[] = "/tmp/dirXXXXXX";
+       char tempfn[15];
+       nox_int tempfd;
        nox_DIR *dp;
        struct nox_dirent *d;
        char buf[DIRBLKSIZ + sizeof(struct direct)], *p, *q;
 
-       res = nox_mkstemp(tempfile);
-       if (res == -1) {
+       strcpy(tempfn, "/tmp/dirXXXXXX");
+       tempfd = nox_mkstemp(tempfn);
+       if (tempfd == -1) {
                errno = htot_errno(nox_errno);
                return (nox_int)-1;
        }
-       if (nox_unlink(tempfile) || (dp = nox_fdopendir(fd)) == 0) {
+       if (nox_unlink(tempfn) || (dp = nox_fdopendir(fd)) == 0) {
                errno = htot_errno(nox_errno);
                nox_close(fd);
                return (nox_int)-1;
@@ -209,7 +210,7 @@ nox_int htot_dir(fd) nox_int fd; {
  /*nox_memset(q, 0xaa, buf + DIRBLKSIZ - q);*/
                                ((struct direct *)p)->d_reclen = buf + DIRBLKSIZ - p;
                                nox_errno = nox_ENOSPC;
-                               if (nox_write(res, buf, (nox_size_t)DIRBLKSIZ) != (nox_ssize_t)DIRBLKSIZ)
+                               if (nox_write(tempfd, buf, (nox_size_t)DIRBLKSIZ) != (nox_ssize_t)DIRBLKSIZ)
                                        goto nogood;
  /*htot_direct(d, q);*/
                                nox_memcpy(buf, q, ((struct direct *)q)->d_reclen);
@@ -221,16 +222,25 @@ nox_int htot_dir(fd) nox_int fd; {
  /*nox_memset(q, 0xaa, buf + DIRBLKSIZ - q);*/
                ((struct direct *)p)->d_reclen = buf + DIRBLKSIZ - p;
                nox_errno = nox_ENOSPC;
-               if (nox_write(res, buf, (nox_size_t)DIRBLKSIZ) != (nox_ssize_t)DIRBLKSIZ)
+               if (nox_write(tempfd, buf, (nox_size_t)DIRBLKSIZ) != (nox_ssize_t)DIRBLKSIZ)
                        goto nogood;
        }
-       if (nox_lseek(res, (nox_off_t)0, nox_SEEK_SET) == (nox_off_t)-1) {
+       if (nox_lseek(tempfd, (nox_off_t)0, nox_SEEK_SET) == (nox_off_t)-1) {
        nogood:
                errno = htot_errno(nox_errno);
                nox_closedir(dp);
-               nox_close(res);
+               nox_close(tempfd);
                return (nox_int)-1;
        }
        nox_closedir(dp);
-       return res;
+       if (nox_dup2(tempfd, fd) == (nox_int)-1) {
+               errno = htot_errno(nox_errno);
+               nox_close(tempfd);
+               return (nox_int)-1;
+       }
+       if (nox_close(tempfd)) {
+               errno = htot_errno(nox_errno);
+               return (nox_int)-1;
+       }
+       return 0;
 }
index 1046130..cfcddd9 100644 (file)
@@ -18,7 +18,6 @@ int vopen(f, m, argp) char *f; int m; va_list argp; {
        nox_mode_t mode;
        nox_int res;
        struct nox_stat stat;
-       nox_int res2;
 
        switch (m & 3) {
        case O_RDONLY:
@@ -57,15 +56,7 @@ int vopen(f, m, argp) char *f; int m; va_list argp; {
                nox_close(res);
                return -1;
        }
-       if (nox_S_ISDIR(stat.nox_st_mode)) {
-               res2 = htot_dir(res);
-               if (res2 == (nox_int)-1)
-                       return -1;
-               if (nox_dup2(res2, res) == (nox_int)-1) {
-                       errno = htot_errno(nox_errno);
-                       nox_close(res2);
-                       return -1;
-               }
-       }
+       if (nox_S_ISDIR(stat.nox_st_mode) && htot_dir(res))
+               return -1;
        return (int)res;
 }
index d5321df..7b3011d 100644 (file)
@@ -13,9 +13,9 @@
 #endif
 
 #ifdef __STDC__
-void execl(char *f, ...)
+int execl(char *f, ...)
 #else
-void execl(f, va_alist) char *f; va_dcl
+int execl(f, va_alist) char *f; va_dcl
 #endif
 {
        va_list argp;
@@ -29,9 +29,9 @@ void execl(f, va_alist) char *f; va_dcl
                        write(2, "execl(): too many arguments\n", 28);
                        abort();
                }
-       execv(f, argv);
+       return execv(f, argv);
 #else
        _va_start(argp, f);
-       execv(f, (char **)argp);
+       return execv(f, (char **)argp);
 #endif
 }
index 41673b8..daf1408 100644 (file)
@@ -13,9 +13,9 @@
 #endif
 
 #ifdef __STDC__
-void execle(char *f, ...)
+int execle(char *f, ...)
 #else
-void execle(f, va_alist) char *f; va_dcl
+int execle(f, va_alist) char *f; va_dcl
 #endif
 {
        va_list argp;
@@ -37,5 +37,5 @@ void execle(f, va_alist) char *f; va_dcl
        while (va_arg(argp, char *))
                ;
 #endif
-       execve(f, argv, va_arg(argp, char **));
+       return execve(f, argv, va_arg(argp, char **));
 }
index 77afe0c..725d434 100644 (file)
@@ -2,7 +2,7 @@
 /*#include <sys/exec.h> gen.h*/
 #include <sys/file.h>
 
-void exect(s, v, e) char *s; char *v[]; char *e[]; {
+int exect(s, v, e) char *s; char *v[]; char *e[]; {
        write(2, "exect()\n", 8);
        abort();
 }
index f1fd034..c26dd7c 100644 (file)
@@ -2,6 +2,6 @@
 
 extern char **environ;
 
-void execv(s, v) char *s; char *v[]; {
-       execve(s, v, environ);
+int execv(s, v) char *s; char *v[]; {
+       return execve(s, v, environ);
 }
index 3ac4e3e..d7ce3fd 100644 (file)
@@ -2,7 +2,7 @@
 /*#include <sys/exec.h> gen.h*/
 #include <sys/file.h>
 
-void execve(s, v, e) char *s; char *v[]; char *e[]; {
+int execve(s, v, e) char *s; char *v[]; char *e[]; {
        write(2, "execve()\n", 9);
        abort();
 }
index f806ee9..5a13fb1 100644 (file)
@@ -44,19 +44,19 @@ int execvp __P((char *name, char **argv));
 int system __P((char *s));
 
 /* sys/execl.c */
-void execl __P((char *f, ...));
+int execl __P((char *f, ...));
 
 /* sys/execle.c */
-void execle __P((char *f, ...));
+int execle __P((char *f, ...));
 
 /* sys/exect.c */
-void exect __P((char *s, char *v[], char *e[]));
+int exect __P((char *s, char *v[], char *e[]));
 
 /* sys/execv.c */
-void execv __P((char *s, char *v[]));
+int execv __P((char *s, char *v[]));
 
 /* sys/execve.c */
-void execve __P((char *s, char *v[], char *e[]));
+int execve __P((char *s, char *v[], char *e[]));
 #endif
 
 #endif