syscall_net: add shutdown()
authorAlan Cox <alan@linux.intel.com>
Fri, 25 Mar 2016 20:50:20 +0000 (20:50 +0000)
committerAlan Cox <alan@linux.intel.com>
Fri, 25 Mar 2016 20:50:20 +0000 (20:50 +0000)
Kernel/include/netdev.h
Kernel/include/syscall_name.h
Kernel/kdata.c
Kernel/syscall_net.c

index d8dcf83..07833db 100644 (file)
@@ -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);
index 8a49f5a..5f0eb9e 100644 (file)
@@ -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
 };
index 44ca367..4a4ed6e 100644 (file)
@@ -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
 };
index e3d3e8f..d8d4685 100644 (file)
@@ -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 */