diff --git a/sys/include/sys/errno.h b/sys/include/sys/errno.h new file mode 100644 index 0000000..87c1218 --- /dev/null +++ b/sys/include/sys/errno.h @@ -0,0 +1,158 @@ +/*- + * Copyright (c) 2002-2018 The UbixOS Project. + * All rights reserved. + * + * This was developed by Christopher W. Olsen for the UbixOS Project. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1) Redistributions of source code must retain the above copyright notice, this list of + * conditions, the following disclaimer and the list of authors. + * 2) Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions, the following disclaimer and the list of authors in the documentation and/or + * other materials provided with the distribution. + * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to + * endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_ERRNO_H_ +#define _SYS_ERRNO_H_ + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* Input/output error */ +#define ENXIO 6 /* Device not configured */ +#define E2BIG 7 /* Argument list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file descriptor */ +#define ECHILD 10 /* No child processes */ +#define EDEADLK 11 /* Resource deadlock avoided */ +/* 11 was EAGAIN */ +#define ENOMEM 12 /* Cannot allocate memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ + +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* Operation not supported by device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* Too many open files in system */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Inappropriate ioctl for device */ +#define ETXTBSY 26 /* Text file busy */ + +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only filesystem */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ + +/* math software */ +#define EDOM 33 /* Numerical argument out of domain */ +#define ERANGE 34 /* Result too large */ + +/* non-blocking and interrupt i/o */ +#define EAGAIN 35 /* Resource temporarily unavailable */ + +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define EINPROGRESS 36 /* Operation now in progress */ +#define EALREADY 37 /* Operation already in progress */ + +/* ipc/network software -- argument errors */ +#define ENOTSOCK 38 /* Socket operation on non-socket */ +#define EDESTADDRREQ 39 /* Destination address required */ +#define EMSGSIZE 40 /* Message too long */ +#define EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 42 /* Protocol not available */ +#define EPROTONOSUPPORT 43 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define EOPNOTSUPP 45 /* Operation not supported */ +#define ENOTSUP EOPNOTSUPP /* Operation not supported */ +#define EPFNOSUPPORT 46 /* Protocol family not supported */ +#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ +#define EADDRINUSE 48 /* Address already in use */ +#define EADDRNOTAVAIL 49 /* Can't assign requested address */ + +/* ipc/network software -- operational errors */ +#define ENETDOWN 50 /* Network is down */ +#define ENETUNREACH 51 /* Network is unreachable */ +#define ENETRESET 52 /* Network dropped connection on reset */ +#define ECONNABORTED 53 /* Software caused connection abort */ +#define ECONNRESET 54 /* Connection reset by peer */ +#define ENOBUFS 55 /* No buffer space available */ +#define EISCONN 56 /* Socket is already connected */ +#define ENOTCONN 57 /* Socket is not connected */ +#define ESHUTDOWN 58 /* Can't send after socket shutdown */ +#define ETOOMANYREFS 59 /* Too many references: can't splice */ +#define ETIMEDOUT 60 /* Operation timed out */ +#define ECONNREFUSED 61 /* Connection refused */ + +#define ELOOP 62 /* Too many levels of symbolic links */ + +#define ENAMETOOLONG 63 + +/* should be rearranged */ +#define EHOSTDOWN 64 /* Host is down */ +#define EHOSTUNREACH 65 /* No route to host */ +#define ENOTEMPTY 66 /* Directory not empty */ + +/* quotas & mush */ +#define EPROCLIM 67 /* Too many processes */ +#define EUSERS 68 /* Too many users */ +#define EDQUOT 69 /* Disc quota exceeded */ + +/* Network File System */ +#define ESTALE 70 /* Stale NFS file handle */ +#define EREMOTE 71 /* Too many levels of remote in path */ +#define EBADRPC 72 /* RPC struct is bad */ +#define ERPCMISMATCH 73 /* RPC version wrong */ +#define EPROGUNAVAIL 74 /* RPC prog. not avail */ +#define EPROGMISMATCH 75 /* Program version wrong */ +#define EPROCUNAVAIL 76 /* Bad procedure for program */ + +#define ENOLCK 77 /* No locks available */ +#define ENOSYS 78 /* Function not implemented */ + +#define EFTYPE 79 /* Inappropriate file type or format */ +#define EAUTH 80 /* Authentication error */ +#define ENEEDAUTH 81 /* Need authenticator */ +#define EIDRM 82 /* Identifier removed */ +#define ENOMSG 83 /* No message of desired type */ +#define EOVERFLOW 84 /* Value too large to be stored in data type */ +#define ECANCELED 85 /* Operation canceled */ +#define EILSEQ 86 /* Illegal byte sequence */ +#define ENOATTR 87 /* Attribute not found */ + +#define EDOOFUS 88 /* Programming error */ + +#define EBADMSG 89 /* Bad message */ +#define EMULTIHOP 90 /* Multihop attempted */ +#define ENOLINK 91 /* Link has been severed */ +#define EPROTO 92 /* Protocol error */ + +#define ENOTCAPABLE 93 /* Capabilities insufficient */ +#define ECAPMODE 94 /* Not permitted in capability mode */ +#define ENOTRECOVERABLE 95 /* State not recoverable */ +#define EOWNERDEAD 96 /* Previous owner died */ + +#define ELAST 96 /* Must be equal largest errno */ + +#endif /* !_SYS_ERNRO_H_ */ diff --git a/sys/kernel/vfs_calls.c b/sys/kernel/vfs_calls.c index 865771d..f669668 100644 --- a/sys/kernel/vfs_calls.c +++ b/sys/kernel/vfs_calls.c @@ -33,12 +33,13 @@ #include #include #include +#include #include #include int sys_open(struct thread *td, struct sys_open_args *args) { - return(kern_openat(td, AT_FDCWD, args->path, args->flags, args->mode)); + return (kern_openat(td, AT_FDCWD, args->path, args->flags, args->mode)); } @@ -64,35 +65,34 @@ else nfp->fd = fopen(args->path, "r"); - if (nfp->fd == 0x0) { fdestroy(td, nfp, fd); td->td_retval[0] = -1; error = -1; -/* + /* - kprintf("[sOA: 0x%X:%s:%s:]", args->flag, args->mode, args->path, td->td_retval[0]); + kprintf("[sOA: 0x%X:%s:%s:]", args->flag, args->mode, args->path, td->td_retval[0]); - if ((args->flag & O_RDONLY) == O_RDONLY) - kprintf("O_RDONLY"); + if ((args->flag & O_RDONLY) == O_RDONLY) + kprintf("O_RDONLY"); - if ((args->flag & O_WRONLY) == O_WRONLY) - kprintf("O_WRONLY"); + if ((args->flag & O_WRONLY) == O_WRONLY) + kprintf("O_WRONLY"); - if ((args->flag & O_RDWR) == O_RDWR) - kprintf("O_RDWR"); + if ((args->flag & O_RDWR) == O_RDWR) + kprintf("O_RDWR"); - if ((args->flag & O_ACCMODE) == O_ACCMODE) - kprintf("O_ACCMODE"); -*/ + if ((args->flag & O_ACCMODE) == O_ACCMODE) + kprintf("O_ACCMODE"); + */ } else { td->td_retval[0] = fd; } - //kprintf("[sOA: 0x%X:%s:%s:]", args->flag, args->mode, args->path, td->td_retval[0]); + //kprintf("[sOA: 0x%X:%s:%s:]", args->flag, args->mode, args->path, td->td_retval[0]); return (error); } @@ -113,33 +113,33 @@ } else { switch (fd->fd_type) { - case 3: - pFD = fd->data; - if (args->fd == pFD->rFD) { - if (pFD->rfdCNT < 2) - fdestroy(td, fd, args->fd); - pFD->rfdCNT--; - } + case 3: + pFD = fd->data; + if (args->fd == pFD->rFD) { + if (pFD->rfdCNT < 2) + fdestroy(td, fd, args->fd); + pFD->rfdCNT--; + } - if (args->fd == pFD->wFD) { - if (pFD->wfdCNT < 2) - fdestroy(td, fd, args->fd); - pFD->wfdCNT--; - } + if (args->fd == pFD->wFD) { + if (pFD->wfdCNT < 2) + fdestroy(td, fd, args->fd); + pFD->wfdCNT--; + } - break; - default: - if (args->fd < 3) - td->td_retval[0] = 0; + break; + default: + if (args->fd < 3) + td->td_retval[0] = 0; + else { + if (!fclose(fd->fd)) + td->td_retval[0] = -1; else { - if (!fclose(fd->fd)) - td->td_retval[0] = -1; - else { - kprintf("DESTROY: !!!!!!!!!!!!!!!!!!!!!!!!!!!!", args->fd); - fdestroy(td, fd, args->fd); - td->td_retval[0] = 0; - } + kprintf("DESTROY: !!!!!!!!!!!!!!!!!!!!!!!!!!!!", args->fd); + fdestroy(td, fd, args->fd); + td->td_retval[0] = 0; } + } } } return (0); @@ -164,7 +164,7 @@ if (args->fd > 3) { switch (fd->fd_type) { - case 3: /* XXX - Pipe2 Handling */ + case 3: /* XXX - Pipe2 Handling */ pFD = fd->data; while (pFD->bCNT == 0 && rpCNT < 100) { sched_yield(); @@ -176,25 +176,24 @@ } else { nbytes = (args->nbyte - (pFD->headPB->nbytes - pFD->headPB->offset) <= 0) ? args->nbyte : (pFD->headPB->nbytes - pFD->headPB->offset); - //kprintf("[unb: , nbs: %i, bf: 0x%X]", args->nbyte, nbytes, fd->fd->buffer); - //kprintf("PR: []", nbytes); - memcpy(args->buf, pFD->headPB->buffer + pFD->headPB->offset, nbytes); - pFD->headPB->offset += nbytes; + //kprintf("[unb: , nbs: %i, bf: 0x%X]", args->nbyte, nbytes, fd->fd->buffer); + //kprintf("PR: []", nbytes); + memcpy(args->buf, pFD->headPB->buffer + pFD->headPB->offset, nbytes); + pFD->headPB->offset += nbytes; - if (pFD->headPB->offset >= pFD->headPB->nbytes) { - rpFD = pFD->headPB; - pFD->headPB = pFD->headPB->next; - kfree(rpFD); - pFD->bCNT--; - } - + if (pFD->headPB->offset >= pFD->headPB->nbytes) { + rpFD = pFD->headPB; + pFD->headPB = pFD->headPB->next; + kfree(rpFD); + pFD->bCNT--; + } td->td_retval[0] = nbytes; -} - break; - default: - //kprintf("[r:0x%X::%i:%s]",fd->fd, args->fd, fd->fd_type, fd->fd->fileName); - td->td_retval[0] = fread(args->buf, args->nbyte, 1, fd->fd); + } + break; + default: + //kprintf("[r:0x%X::%i:%s]",fd->fd, args->fd, fd->fd_type, fd->fd->fileName); + td->td_retval[0] = fread(args->buf, args->nbyte, 1, fd->fd); } } else { @@ -319,13 +318,12 @@ kprintf("[fd: :0x%X, fd_type: %i]", uap->fd, fd, fd->fd_type); switch (fd->fd_type) { - case 3: /* XXX - Temp Pipe Stuff */ + case 3: /* XXX - Temp Pipe Stuff */ pFD = fd->data; pBuf = (struct pipeBuf *) kmalloc(sizeof(struct pipeBuf)); pBuf->buffer = kmalloc(uap->nbyte); - memcpy(pBuf->buffer, uap->buf, uap->nbyte); pBuf->nbytes = uap->nbyte; @@ -338,18 +336,18 @@ if (!pFD->headPB) pFD->headPB = pBuf; - pFD->bCNT++; + pFD->bCNT++; - td->td_retval[0] = nbytes; + td->td_retval[0] = nbytes; - break; - default: - kprintf("[]", uap->nbyte); - buffer = kmalloc(uap->nbyte); - memcpy(buffer, uap->buf, uap->nbyte); - kprintf("() %s", uap->fd, uap->buf); - kfree(buffer); - td->td_retval[0] = uap->nbyte; + break; + default: + kprintf("[]", uap->nbyte); + buffer = kmalloc(uap->nbyte); + memcpy(buffer, uap->buf, uap->nbyte); + kprintf("() %s", uap->fd, uap->buf); + kfree(buffer); + td->td_retval[0] = uap->nbyte; } } @@ -359,14 +357,12 @@ int sys_access(struct thread *td, struct sys_access_args *args) { /* XXX - This is a temporary as it always returns true */ - td->td_retval[0] = 0; return (0); } int sys_getdirentries(struct thread *td, struct sys_getdirentries_args *args) { - struct file *fd = 0x0; getfd(td, &fd, args->fd); @@ -376,7 +372,6 @@ char *s; ssize_t n; - td->td_retval[0] = fread(args->buf, args->count, 1, fd->fd); return (0); @@ -412,7 +407,7 @@ flags = FFLAGS(flags); } - error = falloc(td, &nfp, &fd); + error = falloc(thr, &nfp, &fd); if (error) { thr->td_retval[0] = -1; @@ -424,18 +419,17 @@ nfp->f_flag = flags & FMASK; - - nfp->fd = fopen(args->path, "rwb"); - + nfp->fd = fopen(path, "rwb"); if (nfp->fd == 0x0) { - fdestroy(td, nfp, fd); + fdestroy(thr, nfp, fd); - td->td_retval[0] = -1; + thr->td_retval[0] = -1; + error = -1; } else { - td->td_retval[0] = fd; + thr->td_retval[0] = fd; } //kprintf("sO: 0x%X:%s:", args->mode, args->path, td->td_retval[0]);