From 11711667328ff62d3953ca7eb30209881d8c0bb4 Mon Sep 17 00:00:00 2001 From: Nick Downing Date: Tue, 31 Jan 2017 00:46:09 +1100 Subject: [PATCH] Fix minor bugs in linux/sys directory emulation and bin/sh filename globbing --- bin/sh/Makefile | 2 +- bin/sh/expand.c | 4 ++-- lib/libc/linux/sys/execve.c | 13 +++++++++++-- lib/libc/linux/sys/linux.c | 30 ++++++++++++++++++++---------- lib/libc/linux/sys/vopen.c | 13 ++----------- lib/libc/sys/execl.c | 8 ++++---- lib/libc/sys/execle.c | 6 +++--- lib/libc/sys/exect.c | 2 +- lib/libc/sys/execv.c | 4 ++-- lib/libc/sys/execve.c | 2 +- sys/h/exec.h | 10 +++++----- 11 files changed, 52 insertions(+), 42 deletions(-) diff --git a/bin/sh/Makefile b/bin/sh/Makefile index b733cc6..3745424 100644 --- a/bin/sh/Makefile +++ b/bin/sh/Makefile @@ -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 diff --git a/bin/sh/expand.c b/bin/sh/expand.c index c262f23..8aced80 100644 --- a/bin/sh/expand.c +++ b/bin/sh/expand.c @@ -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; diff --git a/lib/libc/linux/sys/execve.c b/lib/libc/linux/sys/execve.c index 982d290..0f5d1f2 100644 --- a/lib/libc/linux/sys/execve.c +++ b/lib/libc/linux/sys/execve.c @@ -1,7 +1,16 @@ +#include +#include #include +#include #include +#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(); } diff --git a/lib/libc/linux/sys/linux.c b/lib/libc/linux/sys/linux.c index 56875b5..f0209d6 100644 --- a/lib/libc/linux/sys/linux.c +++ b/lib/libc/linux/sys/linux.c @@ -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; } diff --git a/lib/libc/linux/sys/vopen.c b/lib/libc/linux/sys/vopen.c index 1046130..cfcddd9 100644 --- a/lib/libc/linux/sys/vopen.c +++ b/lib/libc/linux/sys/vopen.c @@ -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; } diff --git a/lib/libc/sys/execl.c b/lib/libc/sys/execl.c index d5321df..7b3011d 100644 --- a/lib/libc/sys/execl.c +++ b/lib/libc/sys/execl.c @@ -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 } diff --git a/lib/libc/sys/execle.c b/lib/libc/sys/execle.c index 41673b8..daf1408 100644 --- a/lib/libc/sys/execle.c +++ b/lib/libc/sys/execle.c @@ -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 **)); } diff --git a/lib/libc/sys/exect.c b/lib/libc/sys/exect.c index 77afe0c..725d434 100644 --- a/lib/libc/sys/exect.c +++ b/lib/libc/sys/exect.c @@ -2,7 +2,7 @@ /*#include gen.h*/ #include -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(); } diff --git a/lib/libc/sys/execv.c b/lib/libc/sys/execv.c index f1fd034..c26dd7c 100644 --- a/lib/libc/sys/execv.c +++ b/lib/libc/sys/execv.c @@ -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); } diff --git a/lib/libc/sys/execve.c b/lib/libc/sys/execve.c index 3ac4e3e..d7ce3fd 100644 --- a/lib/libc/sys/execve.c +++ b/lib/libc/sys/execve.c @@ -2,7 +2,7 @@ /*#include gen.h*/ #include -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(); } diff --git a/sys/h/exec.h b/sys/h/exec.h index f806ee9..5a13fb1 100644 --- a/sys/h/exec.h +++ b/sys/h/exec.h @@ -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 -- 2.34.1