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
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);
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);
/* 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;
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;
return _write();
}
-#undef d
+#undef fd
#undef buf
#undef nbytes
#undef uaddr
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;
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 */