diff --git a/sys/include/sys/_sigset.h b/sys/include/sys/_sigset.h new file mode 100644 index 0000000..c488c4e --- /dev/null +++ b/sys/include/sys/_sigset.h @@ -0,0 +1,46 @@ +/*- + * 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__SIGSET_H +#define _SYS__SIGSET_H + +#include + +// sigset_t macros +#define _SIG_WORDS 4 +#define _SIG_MAXSIG 128 +#define _SIG_IDX(sig) ((sig) - 1) +#define _SIG_WORD(sig) (_SIG_IDX(sig) >> 5) +#define _SIG_BIT(sig) (1 << (_SIG_IDX(sig) & 31)) +#define _SIG_VALID(sig) ((sig) <= _SIG_MAXSIG && (sig) > 0) + +typedef struct __sigset { + __uint32_t __bits [_SIG_WORDS]; +} __sigset_t; + +#endif /* END _SYS__SIGSET_H */ diff --git a/sys/include/sys/select.h b/sys/include/sys/select.h new file mode 100644 index 0000000..887a0c6 --- /dev/null +++ b/sys/include/sys/select.h @@ -0,0 +1,98 @@ +/*- + * 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_SELECT_H +#define _SYS_SELECT_H + +#include +#include + +#include + +typedef unsigned long __fd_mask; +typedef __fd_mask fd_mask; + +#ifndef _SIGSET_T_DECLARED +#define _SIGSET_T_DECLARED +typedef __sigset_t sigset_t; +#endif + +/* + * Select uses bit masks of file descriptors in longs. These macros + * manipulate such bit fields (the filesystem macros use chars). + * FD_SETSIZE may be defined by the user, but the default here should + * be enough for most uses. + */ +#ifndef FD_SETSIZE +#define FD_SETSIZE 1024 +#endif + +#define _NFDBITS (sizeof(__fd_mask) * 8) /* bits per mask */ +#define NFDBITS _NFDBITS + +#ifndef _howmany +#define _howmany(x, y) (((x) + ((y) - 1)) / (y)) +#endif + +typedef struct fd_set { + __fd_mask __fds_bits [_howmany(FD_SETSIZE, _NFDBITS)]; +} fd_set; + +#define fds_bits __fds_bits + +#define __fdset_mask(n) ((__fd_mask)1 << ((n) % _NFDBITS)) +#define FD_CLR(n, p) ((p)->__fds_bits[(n)/_NFDBITS] &= ~__fdset_mask(n)) +#define FD_COPY(f, t) (void)(*(t) = *(f)) +#define FD_ISSET(n, p) (((p)->__fds_bits[(n)/_NFDBITS] & __fdset_mask(n)) != 0) +#define FD_SET(n, p) ((p)->__fds_bits[(n)/_NFDBITS] |= __fdset_mask(n)) +#define FD_ZERO(p) do { \ + fd_set *_p; \ + __size_t _n; \ + \ + _p = (p); \ + _n = _howmany(FD_SETSIZE, _NFDBITS); \ + while (_n > 0) \ + _p->__fds_bits[--_n] = 0; \ +} while (0) + +#ifndef _KERNEL + +__BEGIN_DECLS +int pselect(int, fd_set *__restrict, fd_set *__restrict, fd_set *__restrict, const struct timespec *__restrict, const sigset_t *__restrict); + +#ifndef _SELECT_DECLARED +#define _SELECT_DECLARED +/* XXX missing restrict type-qualifier */ +int select(int, fd_set *, fd_set *, fd_set *, struct timeval *); +#endif +__END_DECLS +#endif /* !_KERNEL */ + + + +#endif /* END _SYS_SELECT_H */ diff --git a/sys/include/sys/sysproto.h b/sys/include/sys/sysproto.h index ebb86b9..3564637 100644 --- a/sys/include/sys/sysproto.h +++ b/sys/include/sys/sysproto.h @@ -352,17 +352,33 @@ }; struct sys_mmap_args { - char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)]; - char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)]; - char prot_l_[PADL_(int)]; int prot; char prot_r_[PADR_(int)]; - char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)]; - char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char pos_l_[PADL_(off_t)]; off_t pos; char pos_r_[PADR_(off_t)]; + char addr_l_[PADL_(caddr_t)]; + caddr_t addr; + char addr_r_[PADR_(caddr_t)]; + char len_l_[PADL_(size_t)]; + size_t len; + char len_r_[PADR_(size_t)]; + char prot_l_[PADL_(int)]; + int prot; + char prot_r_[PADR_(int)]; + char flags_l_[PADL_(int)]; + int flags; + char flags_r_[PADR_(int)]; + char fd_l_[PADL_(int)]; + int fd; + char fd_r_[PADR_(int)]; + char pos_l_[PADL_(off_t)]; + off_t pos; + char pos_r_[PADR_(off_t)]; }; struct sys_stat_args { - char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; - char ub_l_[PADL_(struct stat *)]; struct stat * ub; char ub_r_[PADR_(struct stat *)]; + char path_l_[PADL_(char *)]; + char * path; + char path_r_[PADR_(char *)]; + char ub_l_[PADL_(struct stat *)]; + struct stat * ub; + char ub_r_[PADR_(struct stat *)]; }; struct sys_lstat_args { @@ -457,110 +473,195 @@ }; struct sys_openat_args { - char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; - char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)]; - char mode_l_[PADL_(__mode_t)]; __mode_t mode; char mode_r_[PADR_(__mode_t)]; + char fd_l_[PADL_(int)]; + int fd; + char fd_r_[PADR_(int)]; + char path_l_[PADL_(char *)]; + char * path; + char path_r_[PADR_(char *)]; + char flag_l_[PADL_(int)]; + int flag; + char flag_r_[PADR_(int)]; + char mode_l_[PADL_(__mode_t)]; + __mode_t mode; + char mode_r_[PADR_(__mode_t)]; }; struct sys_sysarch_args { - char op_l_[PADL_(int)]; int op; char op_r_[PADR_(int)]; - char parms_l_[PADL_(char *)]; char * parms; char parms_r_[PADR_(char *)]; + char op_l_[PADL_(int)]; + int op; + char op_r_[PADR_(int)]; + char parms_l_[PADL_(char *)]; + char * parms; + char parms_r_[PADR_(char *)]; }; struct sys_getpid_args { - register_t dummy; + register_t dummy; }; struct sys_ioctl_args { - char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char com_l_[PADL_(u_long)]; u_long com; char com_r_[PADR_(u_long)]; - char data_l_[PADL_(caddr_t)]; caddr_t data; char data_r_[PADR_(caddr_t)]; + char fd_l_[PADL_(int)]; + int fd; + char fd_r_[PADR_(int)]; + char com_l_[PADL_(u_long)]; + u_long com; + char com_r_[PADR_(u_long)]; + char data_l_[PADL_(caddr_t)]; + caddr_t data; + char data_r_[PADR_(caddr_t)]; }; struct sys_geteuid_args { - register_t dummy; + register_t dummy; }; struct sys_getppid_args { - register_t dummy; + register_t dummy; }; struct sys_getegid_args { - register_t dummy; + register_t dummy; }; struct sys_sigprocmask_args { - char how_l_[PADL_(int)]; int how; char how_r_[PADR_(int)]; - char set_l_[PADL_(const sigset_t *)]; const sigset_t * set; char set_r_[PADR_(const sigset_t *)]; - char oset_l_[PADL_(sigset_t *)]; sigset_t * oset; char oset_r_[PADR_(sigset_t *)]; + char how_l_[PADL_(int)]; + int how; + char how_r_[PADR_(int)]; + char set_l_[PADL_(const sigset_t *)]; + const sigset_t * set; + char set_r_[PADR_(const sigset_t *)]; + char oset_l_[PADL_(sigset_t *)]; + sigset_t * oset; + char oset_r_[PADR_(sigset_t *)]; }; struct sys_sigaction_args { - char sig_l_[PADL_(int)]; int sig; char sig_r_[PADR_(int)]; - char act_l_[PADL_(const struct sigaction *)]; const struct sigaction * act; char act_r_[PADR_(const struct sigaction *)]; - char oact_l_[PADL_(struct sigaction *)]; struct sigaction * oact; char oact_r_[PADR_(struct sigaction *)]; + char sig_l_[PADL_(int)]; + int sig; + char sig_r_[PADR_(int)]; + char act_l_[PADL_(const struct sigaction *)]; + const struct sigaction * act; + char act_r_[PADR_(const struct sigaction *)]; + char oact_l_[PADL_(struct sigaction *)]; + struct sigaction * oact; + char oact_r_[PADR_(struct sigaction *)]; }; struct sys_getpgrp_args { - register_t dummy; + register_t dummy; }; struct sys_setpgid_args { - char pid_l_[PADL_(int)]; int pid; char pid_r_[PADR_(int)]; - char pgid_l_[PADL_(int)]; int pgid; char pgid_r_[PADR_(int)]; + char pid_l_[PADL_(int)]; + int pid; + char pid_r_[PADR_(int)]; + char pgid_l_[PADL_(int)]; + int pgid; + char pgid_r_[PADR_(int)]; }; struct sys_access_args { - char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; - char amode_l_[PADL_(int)]; int amode; char amode_r_[PADR_(int)]; + char path_l_[PADL_(char *)]; + char * path; + char path_r_[PADR_(char *)]; + char amode_l_[PADL_(int)]; + int amode; + char amode_r_[PADR_(int)]; }; struct sys_statfs_args { - char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; - char buf_l_[PADL_(struct statfs *)]; struct statfs * buf; char buf_r_[PADR_(struct statfs *)]; + char path_l_[PADL_(char *)]; + char * path; + char path_r_[PADR_(char *)]; + char buf_l_[PADL_(struct statfs *)]; + struct statfs * buf; + char buf_r_[PADR_(struct statfs *)]; }; struct sys_fstatat_args { - char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; - char buf_l_[PADL_(struct stat *)]; struct stat * buf; char buf_r_[PADR_(struct stat *)]; - char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)]; + char fd_l_[PADL_(int)]; + int fd; + char fd_r_[PADR_(int)]; + char path_l_[PADL_(char *)]; + char * path; + char path_r_[PADR_(char *)]; + char buf_l_[PADL_(struct stat *)]; + struct stat * buf; + char buf_r_[PADR_(struct stat *)]; + char flag_l_[PADL_(int)]; + int flag; + char flag_r_[PADR_(int)]; }; struct sys_fchdir_args { - char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char fd_l_[PADL_(int)]; + int fd; + char fd_r_[PADR_(int)]; }; struct sys_getdirentries_args { - char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)]; - char count_l_[PADL_(u_int)]; u_int count; char count_r_[PADR_(u_int)]; - char basep_l_[PADL_(long *)]; long * basep; char basep_r_[PADR_(long *)]; + char fd_l_[PADL_(int)]; + int fd; + char fd_r_[PADR_(int)]; + char buf_l_[PADL_(char *)]; + char * buf; + char buf_r_[PADR_(char *)]; + char count_l_[PADL_(u_int)]; + u_int count; + char count_r_[PADR_(u_int)]; + char basep_l_[PADL_(long *)]; + long * basep; + char basep_r_[PADR_(long *)]; }; struct sys_socket_args { - char domain_l_[PADL_(int)]; int domain; char domain_r_[PADR_(int)]; - char type_l_[PADL_(int)]; int type; char type_r_[PADR_(int)]; - char protocol_l_[PADL_(int)]; int protocol; char protocol_r_[PADR_(int)]; + char domain_l_[PADL_(int)]; + int domain; + char domain_r_[PADR_(int)]; + char type_l_[PADL_(int)]; + int type; + char type_r_[PADR_(int)]; + char protocol_l_[PADL_(int)]; + int protocol; + char protocol_r_[PADR_(int)]; }; struct sys_setsockopt_args { - char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)]; - char level_l_[PADL_(int)]; int level; char level_r_[PADR_(int)]; - char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)]; - char val_l_[PADL_(caddr_t)]; caddr_t val; char val_r_[PADR_(caddr_t)]; - char valsize_l_[PADL_(int)]; int valsize; char valsize_r_[PADR_(int)]; + char s_l_[PADL_(int)]; + int s; + char s_r_[PADR_(int)]; + char level_l_[PADL_(int)]; + int level; + char level_r_[PADR_(int)]; + char name_l_[PADL_(int)]; + int name; + char name_r_[PADR_(int)]; + char val_l_[PADL_(caddr_t)]; + caddr_t val; + char val_r_[PADR_(caddr_t)]; + char valsize_l_[PADL_(int)]; + int valsize; + char valsize_r_[PADR_(int)]; }; struct sys_select_args { - char nd_l_[PADL_(int)]; int nd; char nd_r_[PADR_(int)]; - char in_l_[PADL_(fd_set *)]; fd_set * in; char in_r_[PADR_(fd_set *)]; - char ou_l_[PADL_(fd_set *)]; fd_set * ou; char ou_r_[PADR_(fd_set *)]; - char ex_l_[PADL_(fd_set *)]; fd_set * ex; char ex_r_[PADR_(fd_set *)]; - char tv_l_[PADL_(struct timeval *)]; struct timeval * tv; char tv_r_[PADR_(struct timeval *)]; + char nd_l_[PADL_(int)]; + int nd; + char nd_r_[PADR_(int)]; + char in_l_[PADL_(fd_set *)]; + fd_set * in; + char in_r_[PADR_(fd_set *)]; + char ou_l_[PADL_(fd_set *)]; + fd_set * ou; + char ou_r_[PADR_(fd_set *)]; + char ex_l_[PADL_(fd_set *)]; + fd_set * ex; + char ex_r_[PADR_(fd_set *)]; + char tv_l_[PADL_(struct timeval *)]; + struct timeval * tv; + char tv_r_[PADR_(struct timeval *)]; }; - //Func Defs int sys_invalid(struct thread *, void *); int sys_exit(struct thread *, struct sys_exit_args *); @@ -634,5 +735,5 @@ int sys_socket(struct thread *td, struct sys_socket_args *); int sys_setsockopt(struct thread *td, struct sys_setsockopt_args *); -int sys_select(sutrct thread *td, struct sys_select_args *); +int sys_select(struct thread *td, struct sys_select_args *); #endif diff --git a/sys/include/sys/types.h b/sys/include/sys/types.h index 7e170f7..4411c50 100644 --- a/sys/include/sys/types.h +++ b/sys/include/sys/types.h @@ -30,8 +30,7 @@ #define _SYS_TYPES_H_ #include - -#define NULL 0x0 +#include #ifndef NULL #define NULL 0x0 diff --git a/sys/kernel/descrip.c b/sys/kernel/descrip.c index 0580317..26707d3 100644 --- a/sys/kernel/descrip.c +++ b/sys/kernel/descrip.c @@ -34,6 +34,7 @@ #include #include #include +#include static struct file *kern_files = 0x0; @@ -51,15 +52,15 @@ fp = (struct file *) td->o_files[uap->fd]; switch (uap->cmd) { - case 3: - td->td_retval[0] = fp->f_flag; + case 3: + td->td_retval[0] = fp->f_flag; break; - case 4: - fp->f_flag &= ~FCNTLFLAGS; - fp->f_flag |= FFLAGS(uap->arg & ~O_ACCMODE) & FCNTLFLAGS; + case 4: + fp->f_flag &= ~FCNTLFLAGS; + fp->f_flag |= FFLAGS(uap->arg & ~O_ACCMODE) & FCNTLFLAGS; break; - default: - kprintf("ERROR DEFAULT"); + default: + kprintf("ERROR DEFAULT"); } return (0x0); @@ -99,8 +100,7 @@ if (td->o_files[fd] != fp) { error = -1; - } - else { + } else { kfree(td->o_files[fd]); td->o_files[fd] = 0x0; } @@ -175,50 +175,107 @@ } int sys_ioctl(struct thread *td, struct sys_ioctl_args *args) { - switch(args->com) { - case TIOCGETA: - if (args->fd == 0 || args->fd == 1) { - struct termios *t = (struct termios *)args->data; + switch (args->com) { + case TIOCGETA: + if (args->fd == 0 || args->fd == 1) { + struct termios *t = (struct termios *) args->data; - t->c_iflag = 0x2B02; - t->c_oflag = 0x3; - t->c_cflag = 0x4B00; - t->c_lflag = 0x5CB; + t->c_iflag = 0x2B02; + t->c_oflag = 0x3; + t->c_cflag = 0x4B00; + t->c_lflag = 0x5CB; - t->c_cc[0] = 4; - t->c_cc[1] = 255; - t->c_cc[2] = 255; - t->c_cc[3] = 127; - t->c_cc[4] = 23; - t->c_cc[5] = 21; - t->c_cc[6] = 18; - t->c_cc[7] = 8; - t->c_cc[8] = 3; - t->c_cc[9] = 28; - t->c_cc[10] = 26; - t->c_cc[11] = 25; - t->c_cc[12] = 17; - t->c_cc[13] = 19; - t->c_cc[14] = 22; - t->c_cc[15] = 15; - t->c_cc[16] = 1; - t->c_cc[17] = 0; - t->c_cc[18] = 20; - t->c_cc[19] = 255; + t->c_cc[0] = 4; + t->c_cc[1] = 255; + t->c_cc[2] = 255; + t->c_cc[3] = 127; + t->c_cc[4] = 23; + t->c_cc[5] = 21; + t->c_cc[6] = 18; + t->c_cc[7] = 8; + t->c_cc[8] = 3; + t->c_cc[9] = 28; + t->c_cc[10] = 26; + t->c_cc[11] = 25; + t->c_cc[12] = 17; + t->c_cc[13] = 19; + t->c_cc[14] = 22; + t->c_cc[15] = 15; + t->c_cc[16] = 1; + t->c_cc[17] = 0; + t->c_cc[18] = 20; + t->c_cc[19] = 255; - t->c_ispeed = 0x9600; - t->c_ospeed = 0x9600; + t->c_ispeed = 0x9600; + t->c_ospeed = 0x9600; - td->td_retval[0] = 0; - } - else { - td->td_retval[0] = -1; - } - break; - default: - kprintf("ioFD:%i:%i!", args->fd, args->com); + td->td_retval[0] = 0; + } else { + td->td_retval[0] = -1; + } + break; + default: + kprintf("ioFD:%i:%i!", args->fd, args->com); break; } td->td_retval[0] = 0x0; return (0x0); } + +int sys_select(struct thread *td, struct sys_select_args *args) { + int error = 0x0; + int i = 0x0; + + fd_set sock_rfds; + fd_set sock_wfds; + fd_set sock_efds; + + FD_ZERO(&sock_rfds); + FD_ZERO(&sock_wfds); + FD_ZERO(&sock_efds); + + if (args->in != 0x0) { + for (i = 0; i < args->nd; i++) { + FD_SET(((struct file * ) td->o_files[args->in[0]]).socket, &sock_rfds); + } + } + + if (args->ou != 0x0) { + for (i = 0; i < args->nd; i++) { + FD_SET(((struct file * ) td->o_files[args->ou[0]]).socket, &sock_wfds); + } + } + + if (args->ex != 0x0) { + for (i = 0; i < args->nd; i++) { + FD_SET(((struct file * ) td->o_files[args->ex[0]]).socket, &sock_efds); + } + } + + if ((td->td_retval[0] = lwip_select(args->nd, &sock_rfds, &sock_wfds, &sock_efds, args->tv)) == -1) + error = -1; + + if (args->in != 0x0) { + for (i = 0; i < args->nd; i++) { + if (!FD_ISSET(((struct file * ) td->o_files[args->ou[0]]).socket, &sock_rfds)) + FD_CLR(((struct file * ) td->o_files[args->ou[0]]).socket, args->in); + } + } + + if (args->ou != 0x0) { + for (i = 0; i < args->nd; i++) { + if (!FD_ISSET(((struct file * ) td->o_files[args->ou[0]]).socket, &sock_wfds)) + FD_CLR(((struct file * ) td->o_files[args->ou[0]]).socket, args->ou); + } + } + + if (args->ex != 0x0) { + for (i = 0; i < args->nd; i++) { + if (!FD_ISSET(((struct file * ) td->o_files[args->ou[0]]).socket, &sock_efds)) + FD_CLR(((struct file * ) td->o_files[args->ou[0]]).socket, args->ex); + } + } + + + return (error); +} diff --git a/sys/net/net/sys_arch.c b/sys/net/net/sys_arch.c index 2426f1b..1eff086 100644 --- a/sys/net/net/sys_arch.c +++ b/sys/net/net/sys_arch.c @@ -521,44 +521,3 @@ return(0); } - -int sys_select(struct thread *td, struct sys_select_args *args) { - int error = 0; - int i = 0; - - fd_set rfds; - fd_set wfds; - fd_set efds; - - FD_ZERO(&rfds); - FD_ZERO(&wfds); - FD_ZERO(&efds); - - if (args->in != 0x0) { - for (i = 0;i < args->nd;i++) { - rfds[i] = (struct file *)td->o_files[args->in[0]].socket; - } - } - - if (args->ou != 0x0) { - rfds = (fd_set *)kmalloc(sizeof(fd_set) * args->nd); - for (i = 0;i < args->nd;i++) { - rfds[i] = (struct file *)td->o_files[args->ou[0]].socket; - } - } - - if (args->ex != 0x0) { - rfds = (fd_set *)kmalloc(sizeof(fd_set) * args->nd); - for (i = 0;i < args->nd;i++) { - rfds[i] = (struct file *)td->o_files[args->ex[0]].socket; - } - } - - - if ((td->td_retval[0] = lwip_select(nd,&rfds,&wfds,&efds,args->timeval)) == -1) - error = -1; - - return(error); -} - -/* END */