From: Alan Cox Date: Fri, 25 Mar 2016 20:50:20 +0000 (+0000) Subject: syscall_net: add shutdown() X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=ce7e7f2f5edecccd468c27095e4f39f802c01b28;p=FUZIX.git syscall_net: add shutdown() --- diff --git a/Kernel/include/netdev.h b/Kernel/include/netdev.h index d8dcf83b..07833db8 100644 --- a/Kernel/include/netdev.h +++ b/Kernel/include/netdev.h @@ -71,11 +71,12 @@ struct socket uint8_t s_flag; #define SFLAG_ATMP 1 /* Use SADDR_TMP */ uint8_t s_iflag; /* Flags touched in IRQ handlers */ -#define SI_DATA 1 /* Data is ready */ -#define SI_EOF 2 /* At EOF */ -#define SI_THROTTLE 4 /* Transmit is throttled */ +#define SI_SHUTR 1 +#define SI_SHUTW 2 +#define SI_DATA 4 /* Data is ready */ +#define SI_EOF 8 /* At EOF */ +#define SI_THROTTLE 16 /* Transmit is throttled */ void *s_priv; /* Private pointer for lower layers */ - inoptr s_inode; /* Can remove once debugged */ }; #define NSOCKTYPE 3 @@ -103,6 +104,7 @@ extern arg_t _accept(void); extern arg_t _getsockaddrs(void); extern arg_t _sendto(void); extern arg_t _recvfrom(void); +extern arg_t _shutdown(void); /* Hooks for inode.c into the networking */ extern void sock_close(inoptr ino); @@ -119,6 +121,7 @@ extern int net_listen(struct socket *s); extern arg_t net_read(struct socket *s, uint8_t flag); extern arg_t net_write(struct socket *s, uint8_t flag); extern arg_t net_ioctl(uint8_t op, void *p); +extern int net_shutdown(struct socket *s, uint8_t how); /* bit 0 rd, bit 1 wr */ extern void netdev_init(void); extern struct socket *sock_find(uint8_t type, uint8_t sv, struct sockaddrs *sa); extern void sock_init(void); diff --git a/Kernel/include/syscall_name.h b/Kernel/include/syscall_name.h index 8a49f5ac..5f0eb9e1 100644 --- a/Kernel/include/syscall_name.h +++ b/Kernel/include/syscall_name.h @@ -100,7 +100,8 @@ char *syscall_name[NR_SYSCALL] = { "_accept", "_getsockaddrs", "_sendto", - "_recvfrom" + "_recvfrom", + "_shutdown", }; int syscall_args[NR_SYSCALL] = { @@ -202,4 +203,5 @@ int syscall_args[NR_SYSCALL] = { 3, //getsockaddrs 4, //sendto 4, //recvfrom + 2, //shutdown }; diff --git a/Kernel/kdata.c b/Kernel/kdata.c index 44ca367e..4a4ed6e0 100644 --- a/Kernel/kdata.c +++ b/Kernel/kdata.c @@ -136,6 +136,7 @@ const syscall_t syscall_dispatch[FUZIX_SYSCALL_COUNT] = { _getsockaddrs, /* FUZIX system call 95 */ _sendto, /* FUZIX system call 96 */ _recvfrom, /* FUZIX system call 97 */ + _shutdown, /* FUZIX system call 98 */ #endif #endif }; diff --git a/Kernel/syscall_net.c b/Kernel/syscall_net.c index e3d3e8ff..d8d46853 100644 --- a/Kernel/syscall_net.c +++ b/Kernel/syscall_net.c @@ -319,7 +319,6 @@ arg_t make_socket(struct sockinfo *s, struct socket **np) /* The nlink cheat needs to be taught to fsck! */ ino->c_node.i_mode = F_SOCK | 0777; ino->c_node.i_nlink = n->s_num; /* Cheat !! */ - n->s_inode = ino; of_tab[oftindex].o_inode = ino; of_tab[oftindex].o_access = O_RDWR; @@ -547,14 +546,14 @@ char *buf; susize_t len; struct sockio *addr; control buffer ********************************************/ -#define d (int16_t)udata.u_argn +#define fd (int16_t)udata.u_argn #define buf (char *)udata.u_argn1 #define nbytes (susize_t)udata.u_argn2 #define uaddr ((struct sockio *)udata.u_argn3) arg_t _sendto(void) { - struct socket *s = sock_get(d, NULL); + struct socket *s = sock_get(fd, NULL); struct sockaddr_in sin; uint16_t flags; @@ -578,7 +577,7 @@ arg_t _sendto(void) return _write(); } -#undef d +#undef fd #undef buf #undef nbytes #undef uaddr @@ -590,14 +589,14 @@ char *buf; susize_t len; struct sockio *addr; control buffer ********************************************/ -#define d (int16_t)udata.u_argn +#define fd (int16_t)udata.u_argn #define buf (char *)udata.u_argn1 #define nbytes (susize_t)udata.u_argn2 #define uaddr ((struct sockio *)udata.u_argn3) arg_t _recvfrom(void) { - struct socket *s = sock_get(d, NULL); + struct socket *s = sock_get(fd, NULL); int ret; uint16_t flags; @@ -619,11 +618,35 @@ arg_t _recvfrom(void) return ret; } -#undef d +#undef fd #undef buf #undef nbytes #undef uaddr +/******************************************* +shutdown(fd, how) Function ?? +int fd; +int how; +********************************************/ +#define fd (int16_t)udata.u_argn +#define how (uint16_t)udata.u_argn1 + +arg_t _shutdown(void) +{ + struct socket *s = sock_get(fd, NULL); + + if (s == NULL) + return -1; + if (how > 2) { + udata.u_error = EINVAL; + return -1; + } + return net_shutdown(s, how + 1); +} + +#undef fd +#undef how + #endif /* FIXME: Move to _discard */