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
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;
+#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();
}
}
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;
/*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);
/*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;
}
nox_mode_t mode;
nox_int res;
struct nox_stat stat;
- nox_int res2;
switch (m & 3) {
case O_RDONLY:
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;
}
#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;
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
}
#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;
while (va_arg(argp, char *))
;
#endif
- execve(f, argv, va_arg(argp, char **));
+ return execve(f, argv, va_arg(argp, char **));
}
/*#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();
}
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);
}
/*#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();
}
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