Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/fdtable.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/fdtable.c	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/fdtable.c	(revision 387)
@@ -44,26 +44,5 @@
 #include "syssvc/syslog.h"
 #include "target_syssvc.h"
-#ifndef NTSHELL_NO_SOCKET
-#include <tinet_defs.h>
-#include <tinet_config.h>
-#include <net/net.h>
-#include <net/net_endian.h>
-#include <netinet/in.h>
-#include <netinet/in_itron.h>
-#include <tinet_nic_defs.h>
-#include <tinet_cfg.h>
-#include <netinet/in_var.h>
-#include <net/ethernet.h>
-#include <net/if6_var.h>
-#include <net/net.h>
-#include <net/if_var.h>
-#include <netinet/udp.h>
-#include <netinet/udp_var.h>
-#include <netinet/tcp.h>
-#include <netinet/tcp_var.h>
-#include <net/net_buf.h>
-#endif
-#include "ff.h"
-#include "socket_stub.h"
+#include "fdtable.h"
 #include "kernel_cfg.h"
 #include <string.h>
@@ -71,153 +50,18 @@
 #include "hal/serial_api.h"
 
-static int stdio_close(struct SHELL_FILE *fp);
-static size_t stdio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
-static size_t stdio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
-static size_t stdin_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
-static size_t stdout_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
-static size_t stderr_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
-static void stdio_delete(struct SHELL_FILE *fp);
-
-static int sio_close(struct SHELL_FILE *fp);
-static size_t sio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
-static size_t sio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
-static off_t sio_seek(struct SHELL_FILE *fp, off_t ofs, int org);
-static int sio_ioctl(struct SHELL_FILE *fp, int req, void *arg);
-static bool_t sio_readable(struct SHELL_FILE *fp);
-static void sio_delete(struct SHELL_FILE *fp);
-
-IO_TYPE IO_TYPE_STDIN = { stdio_close, stdin_read, stdio_write, sio_seek, sio_ioctl, sio_readable, stdio_delete };
-IO_TYPE IO_TYPE_STDOUT = { stdio_close, stdio_read, stdout_write, sio_seek, sio_ioctl, sio_readable, stdio_delete };
-IO_TYPE IO_TYPE_STDERR = { stdio_close, stdio_read, stderr_write, sio_seek, sio_ioctl, sio_readable, stdio_delete };
-IO_TYPE IO_TYPE_SIO = { sio_close, sio_read, sio_write, sio_seek, sio_ioctl, sio_readable, sio_delete };
-ntstdio_t ntstdio;
+#ifdef _DEBUG
+static const char THIS_FILE[] = __FILE__;
+#endif
+
+extern IO_TYPE IO_TYPE_STDIN;
+extern IO_TYPE IO_TYPE_STDOUT;
+extern IO_TYPE IO_TYPE_STDERR;
 
 static struct SHELL_FILE fd_table[8 * sizeof(FLGPTN)] = {
-	{ 0, &IO_TYPE_STDIN, 0, .exinf = &ntstdio },
-	{ 1, &IO_TYPE_STDOUT, 0, .exinf = &ntstdio },
-	{ 2, &IO_TYPE_STDERR, 0,.exinf = &ntstdio },
+	{ STDIN_FILENO, &IO_TYPE_STDIN, 0 },
+	{ STDOUT_FILENO, &IO_TYPE_STDOUT, 0 },
+	{ STDERR_FILENO, &IO_TYPE_STDERR, 0 },
 };
 #define fd_table_count (sizeof(fd_table) / sizeof(fd_table[0]))
-
-extern ntstdio_t ntstdio;
-serial_t stdio_uart;
-
-unsigned char ntstdio_xi(struct ntstdio_t *handle)
-{
-	return serial_getc((serial_t *)handle->exinf);
-}
-
-void ntstdio_xo(struct ntstdio_t *handle, unsigned char c)
-{
-	serial_putc((serial_t *)handle->exinf, c);
-}
-
-void sys_init(intptr_t exinf)
-{
-	sys_tlsf_init();
-
-	serial_init(&stdio_uart, STDIO_UART_TX, STDIO_UART_RX);
-	serial_baud(&stdio_uart, UART_BAUDRATE);
-	serial_format(&stdio_uart, 8, ParityNone, 1);
-
-	ntstdio_init(&ntstdio, NTSTDIO_OPTION_LINE_ECHO | NTSTDIO_OPTION_CANON | NTSTDIO_OPTION_LF_CRLF | NTSTDIO_OPTION_LF_CR, ntstdio_xi, ntstdio_xo);
-	ntstdio.exinf = (void *)&stdio_uart;
-}
-
-int stdio_close(struct SHELL_FILE *fp)
-{
-	return -EPERM;
-}
-
-size_t stdio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
-{
-	return -EPERM;
-}
-
-size_t stdio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
-{
-	return -EPERM;
-}
-
-size_t stdin_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
-{
-	int i = 0;
-	while (i < len) {
-		int c = ntstdio_getc((struct ntstdio_t *)fp->exinf);
-		data[i++] = c;
-		if ((c == EOF) || (c == '\n'))
-			break;
-	}
-	return i;
-}
-
-size_t stdout_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
-{
-	for (int i = 0; i < len; i++) {
-		ntstdio_putc((struct ntstdio_t *)fp->exinf, data[i]);
-	}
-	return len;
-}
-
-size_t stderr_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
-{
-	for (int i = 0; i < len; i++) {
-		ntstdio_putc((struct ntstdio_t *)fp->exinf, data[i]);
-	}
-	return len;
-}
-
-void stdio_delete(struct SHELL_FILE *fp)
-{
-}
-
-int sio_close(struct SHELL_FILE *fp)
-{
-	return -EPERM;
-}
-
-size_t sio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
-{
-	return -EPERM;
-}
-
-size_t sio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
-{
-	return -EPERM;
-}
-
-off_t sio_seek(struct SHELL_FILE *fp, off_t ofs, int org)
-{
-	return -EPERM;
-}
-
-int sio_ioctl(struct SHELL_FILE *fp, int request, void *arg)
-{
-	switch (request) {
-	case TIOCGWINSZ:
-		return 0;
-	case TCGETS:
-		return sio_tcgetattr(fp->fd, (struct termios *)arg);
-	case TCSETS + TCSANOW:
-	case TCSETS + TCSADRAIN:
-	case TCSETS + TCSAFLUSH:
-		return sio_tcsetattr(fp->fd, request - TCSETS, (const struct termios *)arg);
-	}
-
-	return -EINVAL;
-}
-
-bool_t sio_readable(struct SHELL_FILE *fp)
-{
-	return fp->readevt_w != fp->readevt_r;
-}
-
-void sio_delete(struct SHELL_FILE *fp)
-{
-	free((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf);
-	((struct ntstdio_t *)fp->exinf)->exinf = NULL;
-	free((struct ntstdio_t *)fp->exinf);
-	fp->exinf = NULL;
-}
 
 struct SHELL_FILE *new_fp(IO_TYPE *type, int id, int writable)
@@ -247,4 +91,15 @@
 	if (ret < 0) {
 		syslog(LOG_ERROR, "sig_sem => %d", ret);
+	}
+
+	if (fp != NULL) {
+		FLGPTN flgptn = 0;
+
+		FD_SET(fp->fd, (fd_set *)&flgptn);
+
+		ret = clr_flg(FLG_SELECT_WAIT, ~flgptn);
+		if (ret != E_OK) {
+			syslog(LOG_ERROR, "clr_flg => %d", ret);
+		}
 	}
 
@@ -442,50 +297,9 @@
 }
 
-/* TODO:コールバック化したい */
-void stdio_update_evts()
-{
-	int fd = STDIN_FILENO;
-	struct SHELL_FILE *fp = &fd_table[fd];
-	FLGPTN flgptn = 0;
-
-	if (serial_readable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) {
-		if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
-
-		FD_SET(fd, (fd_set *)&flgptn);
-	}
-	if (serial_writable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) {
-		if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
-
-		FD_SET(fd, (fd_set *)&flgptn);
-	}
-
-	if (flgptn != 0) {
-		set_flg(FLG_SELECT_WAIT, flgptn);
-	}
-}
-
-/* TODO:コールバック化したい */
-void stdio_flgptn(FLGPTN *flgptn)
-{
-	int fd = STDIN_FILENO;
-	struct SHELL_FILE *fp = &fd_table[fd];
-	*flgptn = 0;
-
-	if (serial_readable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) {
-		if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
-
-		FD_SET(fd, (fd_set *)flgptn);
-	}
-	if (serial_writable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) {
-		if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
-
-		FD_SET(fd, (fd_set *)flgptn);
-	}
-}
-
 ER shell_get_evts(struct fd_events *evts, TMO tmout)
 {
 	int count = 0;
 	SYSTIM prev, now;
+	FLGPTN flgptn;
 
 	get_tim(&prev);
@@ -493,8 +307,6 @@
 	for (;;) {
 		ER ret;
-		FLGPTN waitptn, flgptn, readfds = 0, writefds = 0;
+		FLGPTN waitptn, readfds = 0, writefds = 0;
 		struct SHELL_FILE *fp = NULL;
-
-		stdio_update_evts();
 
 #ifndef NTSHELL_NO_SOCKET
@@ -506,5 +318,4 @@
 			fp = &fd_table[fd];
 
-#ifndef NTSHELL_NO_SOCKET
 			if (FD_ISSET(fd, &evts->readfds)) {
 				if (fp->type->readable(fp)) {
@@ -517,7 +328,7 @@
 				}
 			}
-#endif
+
 			if (FD_ISSET(fd, &evts->writefds)) {
-				if (fp->writeevt_w == fp->writeevt_r) {
+				if (fp->type->writable(fp)) {
 					FD_SET(fd, (fd_set *)&writefds);
 					count++;
@@ -549,46 +360,41 @@
 				return ret;
 			}
-
-			stdio_flgptn(&flgptn);
-
-			if (flgptn == 0)
-				return E_TMOUT;
-		}
-		flgptn &= waitptn;
-
-		/* 受け取ったフラグのみクリア */
-		ret = clr_flg(FLG_SELECT_WAIT, ~flgptn);
-		if (ret != E_OK) {
-			syslog(LOG_ERROR, "clr_flg => %d", ret);
+		}
+
+		if (flgptn != 0) {
+			flgptn &= waitptn;
+
+			/* 受け取ったフラグのみクリア */
+			ret = clr_flg(FLG_SELECT_WAIT, ~flgptn);
+			if (ret != E_OK) {
+				syslog(LOG_ERROR, "clr_flg => %d", ret);
+			}
 		}
 
 		count = 0;
 		for (int fd = 0; fd < fd_table_count; fd++) {
-			if (!FD_ISSET(fd, (fd_set *)&waitptn))
-				continue;
-
 			fp = &fd_table[fd];
 
 			if (fp->readevt_w != fp->readevt_r) {
 				fp->readevt_r++;
-				FD_SET(fd, &evts->readfds);
+				if (FD_ISSET(fd, (fd_set *)&waitptn))
+					FD_SET(fd, &evts->readfds);
 				count++;
 			}
 			if (fp->writeevt_w != fp->writeevt_r) {
 				fp->writeevt_r++;
-				fp->writable = 1;
-			}
-			if (fp->writable) {
-				FD_SET(fd, &evts->writefds);
+				if (FD_ISSET(fd, (fd_set *)&waitptn))
+					FD_SET(fd, &evts->writefds);
 				count++;
 			}
 			if (fp->errorevt_w != fp->errorevt_r) {
 				fp->errorevt_r++;
-				FD_SET(fd, &evts->errorfds);
+				if (FD_ISSET(fd, (fd_set *)&waitptn))
+					FD_SET(fd, &evts->errorfds);
 				count++;
 			}
 		}
 
-		if (count > 0)
+		if ((flgptn == 0) || (count > 0))
 			break;
 
@@ -596,6 +402,8 @@
 
 		SYSTIM elapse = now - prev;
-		if (elapse > tmout)
-			return E_TMOUT;
+		if (elapse > tmout) {
+			flgptn = 0;
+			break;
+		}
 
 		prev = now;
@@ -605,5 +413,5 @@
 	evts->count = count;
 
-	return E_OK;
+	return (flgptn == 0) ? E_TMOUT : E_OK;
 }
 
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/fdtable.h
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/fdtable.h	(revision 387)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/fdtable.h	(revision 387)
@@ -0,0 +1,85 @@
+/*
+ *  TOPPERS ECHONET Lite Communication Middleware
+ * 
+ *  Copyright (C) 2017 Cores Co., Ltd. Japan
+ * 
+ *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
+ *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+ *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+ *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+ *      スコード中に含まれていること．
+ *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+ *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+ *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+ *      の無保証規定を掲載すること．
+ *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+ *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+ *      と．
+ *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+ *        作権表示，この利用条件および下記の無保証規定を掲載すること．
+ *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+ *        報告すること．
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+ *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること．
+ * 
+ *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+ *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+ *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+ *  の責任を負わない．
+ * 
+ *  @(#) $Id$
+ */
+#ifndef SOCKET_STUB_H
+#define SOCKET_STUB_H
+
+typedef const struct io_type_s IO_TYPE;
+
+struct SHELL_FILE {
+	int fd;
+	IO_TYPE *type;
+	int handle;
+	int readevt_r;
+	int readevt_w;
+	int writeevt_r;
+	int writeevt_w;
+	int writable;
+	int errorevt_r;
+	int errorevt_w;
+	void *exinf;
+};
+
+struct io_type_s {
+	int (*close)(struct SHELL_FILE *);
+	size_t (*read)(struct SHELL_FILE *, unsigned char *, size_t);
+	size_t (*write)(struct SHELL_FILE *, const unsigned char *, size_t);
+	off_t (*seek)(struct SHELL_FILE *, off_t, int);
+	int (*ioctl)(struct SHELL_FILE *, int, void *);
+	bool_t (*readable)(struct SHELL_FILE *);
+	bool_t (*writable)(struct SHELL_FILE *);
+	void (*delete)(struct SHELL_FILE *);
+};
+
+#ifndef bool
+#define bool int
+#endif
+#ifndef true
+#define true 1
+#endif
+#ifndef false
+#define false 0
+#endif
+
+struct SHELL_FILE *new_fp(IO_TYPE *type, int id, int writable);
+int delete_fd_by_id(IO_TYPE *type, int id);
+struct SHELL_FILE *fd_to_fp(int fd);
+struct SHELL_FILE *id_to_fd(IO_TYPE *type, int id);
+
+int delete_fp(struct SHELL_FILE *fp);
+void clean_fd();
+
+#endif // !SOCKET_STUB_H
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/io_stub.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/io_stub.c	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/io_stub.c	(revision 387)
@@ -45,5 +45,5 @@
 #include "syssvc/serial.h"
 #include "syssvc/syslog.h"
-#include "socket_stub.h"
+#include "fdtable.h"
 #include "util/ntstdio.h"
 #include "usrcmd.h"
@@ -51,4 +51,9 @@
 #include "kernel_cfg.h"
 #include "target_syssvc.h"
+
+struct SHELL_DIR {
+	FATFS_DIR dir;
+	struct dirent dirent;
+};
 
 int fresult2errno(FRESULT res)
@@ -85,4 +90,5 @@
 static int file_ioctl(struct SHELL_FILE *fp, int req, void *arg);
 static bool_t file_readable(struct SHELL_FILE *fp);
+static bool_t file_writable(struct SHELL_FILE *fp);
 static void file_delete(struct SHELL_FILE *fp);
 
@@ -93,8 +99,9 @@
 static int dir_ioctl(struct SHELL_FILE *fp, int req, void *arg);
 static bool_t dir_readable(struct SHELL_FILE *fp);
+static bool_t dir_writable(struct SHELL_FILE *fp);
 static void dir_delete(struct SHELL_FILE *fp);
 
-IO_TYPE IO_TYPE_FILE = { file_close, file_read, file_write, file_seek, file_ioctl, file_readable, file_delete };
-IO_TYPE IO_TYPE_DIR = { dir_close, dir_read, dir_write, dir_seek, dir_ioctl, dir_readable, dir_delete };
+IO_TYPE IO_TYPE_FILE = { file_close, file_read, file_write, file_seek, file_ioctl, file_readable, file_writable, file_delete };
+IO_TYPE IO_TYPE_DIR = { dir_close, dir_read, dir_write, dir_seek, dir_ioctl, dir_readable, dir_writable, dir_delete };
 
 int shell_open(const char *path, int flags, void *arg)
@@ -114,4 +121,5 @@
 		FRESULT res;
 		if ((res = f_opendir(dir, path)) != FR_OK) {
+			delete_fp(fp);
 			return fresult2errno(res);
 		}
@@ -165,4 +173,5 @@
 	}
 
+	delete_fp(fp);
 	return fresult2errno(res);
 }
@@ -239,4 +248,9 @@
 }
 
+bool_t file_writable(struct SHELL_FILE *fp)
+{
+	return fp->writable && (fp->writeevt_w == fp->writeevt_r);
+}
+
 void file_delete(struct SHELL_FILE *fp)
 {
@@ -356,84 +370,4 @@
 {
 	return shell_ioctl(fd, cmd, arg);
-}
-
-extern IO_TYPE IO_TYPE_SIO;
-
-int sio_tcgetattr(int fd, struct termios *termios)
-{
-	struct SHELL_FILE *fp = fd_to_fp(fd);
-	if ((fp == NULL) || (fp->type != &IO_TYPE_SIO))
-		return -EBADF;
-
-	ntstdio_t *ntstdio = (ntstdio_t *)fp->exinf;
-
-	memset(termios, 0, sizeof(*termios));
-
-	if (ntstdio->option & NTSTDIO_OPTION_LINE_ECHO) {
-		termios->c_lflag |= ECHO;
-	}
-	else {
-		termios->c_lflag &= ~ECHO;
-	}
-	if (ntstdio->option & NTSTDIO_OPTION_CANON) {
-		termios->c_lflag |= ICANON;
-	}
-	else {
-		termios->c_lflag &= ~ICANON;
-	}
-	if (ntstdio->option & NTSTDIO_OPTION_LF_CR) {
-		termios->c_iflag |= INLCR;
-	}
-	else {
-		termios->c_iflag &= ~INLCR;
-	}
-	if (ntstdio->option & NTSTDIO_OPTION_LF_CRLF) {
-		termios->c_oflag |= ONLCR;
-	}
-	else {
-		termios->c_oflag &= ~ONLCR;
-	}
-
-	return 0;
-}
-
-int sio_tcsetattr(int fd, int optional_actions, const struct termios *termios)
-{
-	struct SHELL_FILE *fp = fd_to_fp(fd);
-	if ((fp == NULL) || (fp->type != &IO_TYPE_SIO))
-		return -EBADF;
-
-	ntstdio_t *ntstdio = (ntstdio_t *)fp->exinf;
-
-	if (optional_actions == TCSANOW) {
-		if (termios->c_lflag & ECHO) {
-			ntstdio->option |= NTSTDIO_OPTION_LINE_ECHO;
-		}
-		else {
-			ntstdio->option &= ~NTSTDIO_OPTION_LINE_ECHO;
-		}
-		if (termios->c_lflag & ICANON) {
-			ntstdio->option |= NTSTDIO_OPTION_CANON;
-		}
-		else {
-			ntstdio->option &= ~NTSTDIO_OPTION_CANON;
-		}
-		if (termios->c_iflag & INLCR) {
-			ntstdio->option |= NTSTDIO_OPTION_LF_CR;
-		}
-		else {
-			ntstdio->option &= ~NTSTDIO_OPTION_LF_CR;
-		}
-		if (termios->c_oflag & ONLCR) {
-			ntstdio->option |= NTSTDIO_OPTION_LF_CRLF;
-		}
-		else {
-			ntstdio->option &= ~NTSTDIO_OPTION_LF_CRLF;
-		}
-		return 0;
-	}
-
-	shell_abort();
-	return 0;
 }
 
@@ -688,4 +622,9 @@
 }
 
+bool_t dir_writable(struct SHELL_FILE *fp)
+{
+	return false;
+}
+
 void dir_delete(struct SHELL_FILE *fp)
 {
@@ -710,102 +649,2 @@
 	return 0;
 }
-
-#ifndef _MSC_VER
-extern uint32_t _HeapBase;
-extern uint32_t _HeapLimit;
-#else
-uint8_t _HeapBase[14 * 4096];
-#define _HeapLimit _HeapBase[sizeof(_HeapBase)]
-#endif
-
-void *shell_brk(void *addr)
-{
-	if (addr == 0) {
-		return (void *)(&_HeapBase);
-	}
-	if ((addr >= (void *)&_HeapBase) && (addr < (void *)&_HeapLimit)) {
-		return addr;
-	}
-	return (void *)-1;
-}
-
-void *shell_mmap2(void *start, size_t length, int prot, int flags, int fd, off_t pgoffset)
-{
-	if (fd != -1)
-		return (void *)-EINVAL;
-
-	if ((length >= 0) && (length <= sizeof(&_HeapBase))) {
-		return &_HeapBase;
-	}
-	return (void *)-1;
-}
-
-int shell_mprotect(void *addr, size_t len, int prot)
-{
-	//if ((addr >= (void *)&_HeapBase) && (addr + len < (void *)&_HeapLimit)) {
-	return 0;
-//}
-//return -1;
-}
-
-#include "tlsf.h"
-
-static tlsf_t sys_tlsf;
-static pool_t sys_pool;
-
-void sys_tlsf_init(void)
-{
-	sys_tlsf = tlsf_create(&_HeapBase);
-	if (sys_tlsf == NULL)
-		return;
-
-	sys_pool = tlsf_add_pool(sys_tlsf, ((uint8_t *)&_HeapBase) + tlsf_size(), ((intptr_t)&_HeapLimit - (intptr_t)&_HeapBase) - tlsf_size());
-}
-
-void sys_fini(void)
-{
-	tlsf_destroy(sys_tlsf);
-}
-
-void *malloc(size_t size)
-{
-	void *result;
-	wai_sem(SEM_MALLOC);
-	result = tlsf_malloc(sys_tlsf, size);
-	sig_sem(SEM_MALLOC);
-	if (result == NULL)
-		tlsf_check_pool(sys_pool);
-	return result;
-}
-
-void *calloc(size_t size, size_t count)
-{
-	void *result;
-	wai_sem(SEM_MALLOC);
-	result = tlsf_malloc(sys_tlsf, count * size);
-	sig_sem(SEM_MALLOC);
-	if (result != NULL)
-		memset(result, 0, count * size);
-	else
-		tlsf_check_pool(sys_pool);
-	return result;
-}
-
-void *realloc(void *ptr, size_t size)
-{
-	void *result;
-	wai_sem(SEM_MALLOC);
-	result = tlsf_realloc(sys_tlsf, ptr, size);
-	sig_sem(SEM_MALLOC);
-	if (result == NULL)
-		tlsf_check_pool(sys_pool);
-	return result;
-}
-
-void free(void *ptr)
-{
-	wai_sem(SEM_MALLOC);
-	tlsf_free(sys_tlsf, ptr);
-	sig_sem(SEM_MALLOC);
-}
-
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/net_misc.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/net_misc.c	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/net_misc.c	(revision 387)
@@ -95,5 +95,5 @@
 
 	get_tid(&nc->tskid);
-	printf("[NET MISC:%d,%d] started.", nc->tskid, (ID)exinf);
+	syslog(LOG_NOTICE, "[NET MISC:%d,%d] started.", nc->tskid, (ID)exinf);
 
 	/* 初期化 */
@@ -103,5 +103,5 @@
 	ret = get_tim(&time);
 	if (ret != E_OK) {
-		printf("[NET MISC,%d] get_tim error: %7lu,%s",
+		syslog(LOG_NOTICE, "[NET MISC,%d] get_tim error: %7lu,%s",
 			nc->cepid, time / SYSTIM_HZ, itron_strerror(ret));
 		return;
@@ -117,5 +117,5 @@
 		error = tslp_tsk(timer);
 		if ((error != E_OK) && (error != E_TMOUT)) {
-			printf("[NET MISC,%d] tslp_tsk error: %s %d",
+			syslog(LOG_NOTICE, "[NET MISC,%d] tslp_tsk error: %s %d",
 				nc->cepid, itron_strerror(error), timer);
 			break;
@@ -124,5 +124,5 @@
 		ret = get_tim(&time);
 		if (ret != E_OK) {
-			printf("[NET MISC,%d] get_tim error: %s",
+			syslog(LOG_NOTICE, "[NET MISC,%d] get_tim error: %s",
 				nc->cepid, itron_strerror(ret));
 			break;
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/ntp_cli.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/ntp_cli.c	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/ntp_cli.c	(revision 387)
@@ -277,5 +277,5 @@
 	}
 
-	printf("[NTP CLI,%d] recv time: %s .%09u\n",
+	syslog(LOG_NOTICE, "[NTP CLI,%d] recv time: %s .%09u",
 		nc->cepid, nc->buf, tp.tv_nsec);
 }
@@ -309,5 +309,5 @@
 		line = lookup_ipaddr(&nc->ipaddr6, NTP_SRV_URL, API_PROTO_IPV4);
 		if (line == NULL || !in6_is_addr_ipv4mapped(&nc->ipaddr6)) {
-			printf("[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
+			syslog(LOG_NOTICE, "[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
 				nc->cepid, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ);
 			nc->timer = SLP_ITV;
@@ -317,5 +317,5 @@
 #else	/* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) */
 		if ((line = lookup_ipaddr(&nc->snd_rmt.ipaddr, NTP_SRV_URL, DEFAULT_API_PROTO)) == NULL) {
-			printf("[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
+			syslog(LOG_NOTICE, "[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
 				nc->cepid, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ);
 			nc->timer = SLP_ITV;
@@ -421,10 +421,10 @@
 
 	if ((error = udp_snd_dat(nc->cepid, &nc->snd_rmt, ntp, len, TMO_NBLK)) != E_WBLK) {
-		printf("[NTP CLI,%d] udp_snd_dat error: %s",
+		syslog(LOG_NOTICE, "[NTP CLI,%d] udp_snd_dat error: %s",
 			nc->cepid, itron_strerror(error));
 		return error;
 	}
 	else
-		syslog(LOG_DEBUG, "[NTP CLI,%d] udp_snd_dat: to: %s.%d\n",
+		syslog(LOG_DEBUG, "[NTP CLI,%d] udp_snd_dat: to: %s.%d",
 			nc->cepid, ip2str(NULL, &nc->snd_rmt.ipaddr), nc->snd_rmt.portno);
 
@@ -439,5 +439,5 @@
 	ret = get_tim(&time);
 	if (ret != E_OK) {
-		printf("[NTP CLI,%d] get_tim error: %s",
+		syslog(LOG_NOTICE, "[NTP CLI,%d] get_tim error: %s",
 			nc->cepid, itron_strerror(ret));
 		tp->tv_sec = 0;
@@ -459,5 +459,5 @@
 	ret = set_tim(time);
 	if (ret != E_OK) {
-		printf("[NTP CLI,%d] set_tim error: %s",
+		syslog(LOG_NOTICE, "[NTP CLI,%d] set_tim error: %s",
 			nc->cepid, itron_strerror(ret));
 	}
@@ -477,5 +477,5 @@
 	if (len < 0 && len != E_RLWAI) {
 		/* E_RLWAI 以外で、0 以下の場合は、エラーを意味している。*/
-		printf("[NTP CLI,%d] callback error: %s, fncd: %s", nc->cepid,
+		syslog(LOG_NOTICE, "[NTP CLI,%d] callback error: %s, fncd: %s", nc->cepid,
 			itron_strerror(len), in_strtfn(fncd));
 	}
@@ -484,5 +484,5 @@
 			if ((len = udp_rcv_dat(nc->cepid, &nc->rcv_rmt, &nc->ntp_msg, len, TMO_POL)) < 0)
 			{
-				printf("[NTP CLI,%d] udp_rcv_dat error: %s", nc->cepid,
+				syslog(LOG_NOTICE, "[NTP CLI,%d] udp_rcv_dat error: %s", nc->cepid,
 					itron_strerror(len));
 			}
@@ -516,5 +516,5 @@
 
 	get_tid(&nc->tskid);
-	printf("[NTP CLI:%d,%d] started.", nc->tskid, (ID)exinf);
+	syslog(LOG_NOTICE, "[NTP CLI:%d,%d] started.", nc->tskid, (ID)exinf);
 
 	/* 初期化 */
@@ -523,5 +523,5 @@
 	ret = get_tim(&time);
 	if (ret != E_OK) {
-		printf("[NTP CLI,%d] get_tim error: %7lu,%s",
+		syslog(LOG_NOTICE, "[NTP CLI,%d] get_tim error: %7lu,%s",
 			nc->cepid, time / SYSTIM_HZ, itron_strerror(ret));
 		return;
@@ -537,5 +537,5 @@
 		error = tslp_tsk(timer);
 		if ((error != E_OK) && (error != E_TMOUT)) {
-			printf("[NTP CLI,%d] tslp_tsk error: %s %d",
+			syslog(LOG_NOTICE, "[NTP CLI,%d] tslp_tsk error: %s %d",
 				nc->cepid, itron_strerror(error), timer);
 			break;
@@ -544,5 +544,5 @@
 		ret = get_tim(&time);
 		if (ret != E_OK) {
-			printf("[NTP CLI,%d] get_tim error: %s",
+			syslog(LOG_NOTICE, "[NTP CLI,%d] get_tim error: %s",
 				nc->cepid, itron_strerror(ret));
 			break;
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell.cdl
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell.cdl	(revision 387)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell.cdl	(revision 387)
@@ -0,0 +1,79 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2015 by Ushio Laboratory
+ *              Graduate School of Engineering Science, Osaka Univ., JAPAN
+ *  Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
+ *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+ *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+ *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+ *      スコード中に含まれていること．
+ *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+ *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+ *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+ *      の無保証規定を掲載すること．
+ *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+ *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+ *      と．
+ *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+ *        作権表示，この利用条件および下記の無保証規定を掲載すること．
+ *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+ *        報告すること．
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+ *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること．
+ * 
+ *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+ *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+ *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+ *  の責任を負わない．
+ * 
+ *  $Id$
+ */
+
+import_C("target_syssvc.h");
+
+/*
+ *  タスクのスタックサイズのデフォルト
+ */
+const size_t DefaultTaskStackSize = 1024;		/* スタックサイズ（1KB）*/
+
+/*
+ *  システムログタスクのスタックサイズの定義
+ */
+const size_t LogTaskStackSize = DefaultTaskStackSize;
+
+/*
+ *  カーネル起動メッセージに関する定義
+ */
+const char *const BannerTargetName = C_EXP("TARGET_NAME");		/* ターゲット名 */
+const char *const BannerCopyrightNotice = "";			/* 著作権表示 */
+
+/*
+ *  ターゲット依存のセルタイプの定義
+ */
+import("syssvc/tPutLogSIOPort.cdl");
+import("tSIOPortNTShell.cdl");
+
+/*
+ *  シリアルインタフェースドライバのターゲット依存部の組み上げ記述
+ */
+cell tSIOPortNTShell SIOPortTarget1 {
+};
+
+/*
+ *  低レベル出力の組み上げ記述
+ */
+cell tPutLogSIOPort PutLogTarget {
+	/* SIOドライバとの結合 */
+	cSIOPort = SIOPortTarget1.eSIOPort;
+};
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell_main.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell_main.c	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell_main.c	(revision 387)
@@ -49,4 +49,5 @@
 #include "syssvc/syslog.h"
 #include "target_syssvc.h"
+#include "target_serial.h"
 #include "kernel_cfg.h"
 #include "ffarch.h"
@@ -58,5 +59,5 @@
 #include "util/ntopt.h"
 #include "ntshell_main.h"
-#include "socket_stub.h"
+#include "fdtable.h"
 
 char command[NTOPT_TEXT_MAXLEN];
@@ -78,4 +79,5 @@
 }
 
+void stdio_open(ID portid);
 static int usrcmd_ntopt_callback(long *args, void *extobj);
 
@@ -86,5 +88,5 @@
 void ntshell_task_init(ID portid)
 {
-	serial_ctl_por(portid, IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV);
+	stdio_open(portid);
 }
 
@@ -95,5 +97,12 @@
 {
 	ntshell_state = 1;
-	ntshell_exit_code = ntopt_parse(command, usrcmd_ntopt_callback, NULL);
+
+	if (setjmp(process_exit) == 0) {
+		ntshell_exit_code = ntopt_parse(command, usrcmd_ntopt_callback, NULL);
+	}
+
+	fflush(stdout);
+	clean_fd();
+
 	ntshell_state = 2;
 }
@@ -139,6 +148,4 @@
 		printf("Unknown command found.\n");
 
-	clean_fd();
-
 	return result;
 }
@@ -285,9 +292,18 @@
 }
 
-struct sigaction sigtable[7];
-
-int shell_sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *restrict old)
-{
-	struct sigaction *sat;
+// musl-1.1.18\src\internal\ksigaction.h
+struct k_sigaction {
+	void(*handler)(int);
+	unsigned long flags;
+	void(*restorer)(void);
+	unsigned mask[2];
+};
+
+struct k_sigaction sigtable[7];
+
+int shell_sigaction(int sig, const struct k_sigaction *__restrict sa,
+	struct k_sigaction *__restrict old, size_t size)
+{
+	struct k_sigaction *sat;
 
 	switch(sig){
@@ -318,7 +334,7 @@
 
 	if (old != NULL)
-		memcpy(old, sat, sizeof(struct sigaction));
-
-	memcpy(sat, sa, sizeof(struct sigaction));
+		memcpy(old, sat, offsetof(struct k_sigaction, mask) + size);
+
+	memcpy(sat, sa, offsetof(struct k_sigaction, mask) + size);
 
 	return 0;
@@ -368,2 +384,34 @@
 }
 
+int shell_nanosleep(const struct timespec *req, struct timespec *rem)
+{
+	ER ret;
+	TMO tmo;
+	SYSTIM prev, now, diff;
+
+	if ((req == NULL) || (req->tv_nsec < 0) || (req->tv_nsec >= 1000000000))
+		return -EINVAL;
+
+	get_tim(&prev);
+
+	tmo = req->tv_sec * 1000000 + req->tv_nsec / 1000;
+	ret = tslp_tsk(tmo);
+	if (ret == E_OK) {
+		if (rem != NULL) {
+			get_tim(&now);
+			diff = now - prev;
+			rem->tv_sec = diff / 1000000ll;
+			rem->tv_nsec = (diff - (rem->tv_sec * 1000000ll)) * 1000ll;
+		}
+		return 0;
+	}
+	else if (ret == E_TMOUT) {
+		if (rem != NULL) {
+			rem->tv_sec = 0;
+			rem->tv_nsec = 0;
+		}
+		return 0;
+	}
+
+	return -EFAULT;
+}
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell_main.cfg
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell_main.cfg	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell_main.cfg	(revision 387)
@@ -46,3 +46,2 @@
 CRE_FLG(FLG_SELECT_WAIT, { TA_WMUL, 0x00 });
 CRE_SEM(SEM_FILEDESC, { TA_TPRI, 1, 1 });
-CRE_SEM(SEM_MALLOC, { TA_TPRI, 1, 1 });
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/shellif.h
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/shellif.h	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/shellif.h	(revision 387)
@@ -74,7 +74,7 @@
 #define NCCS 32
 
-#include <bits/fcntl.h>
-#include <bits/termios.h>
-#include <bits/stat.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <sys/stat.h>
 #include <sys/select.h>
 #include <time.h>
@@ -85,6 +85,6 @@
 #include <sys/utsname.h>
 #include <dirent.h>
-#include <bits/ioctl.h>
-#include <bits/errno.h>
+#include <sys/ioctl.h>
+#include <errno.h>
 #include <sys/socket.h>
 #else
@@ -132,4 +132,5 @@
 // time.h
 #define CLOCK_REALTIME 0
+int shell_nanosleep(const struct timespec *req, struct timespec *rem);
 
 // dirent.h
@@ -177,5 +178,7 @@
 // signal.h
 int shell_sigprocmask(int how, const sigset_t *__restrict set, sigset_t *__restrict old);
-int shell_sigaction(int sig, const struct sigaction *__restrict sa, struct sigaction *__restrict old);
+struct k_sigaction;
+int shell_sigaction(int sig, const struct k_sigaction *__restrict sa,
+	struct k_sigaction *__restrict old, size_t size);
 // socket.h
 int shell_socket(int, int, int);
@@ -197,7 +200,4 @@
 // syslog.h
 void vsyslog (int, const char *, va_list);
-// termios.h
-int sio_tcgetattr (int, struct termios *);
-int sio_tcsetattr(int, int, const struct termios *);
 // fcntl.h
 int shell_open(const char *, int, void *arg);
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/socket_stub.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/socket_stub.c	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/socket_stub.c	(revision 387)
@@ -62,10 +62,77 @@
 #include <netinet/tcp_var.h>
 #include <netapp/resolver.h>
-extern const ID tmax_tcp_cepid;
-#include "ff.h"
-#include "socket_stub.h"
+#include "fdtable.h"
 #include "kernel_cfg.h"
 
+#ifdef _DEBUG
+static const char THIS_FILE[] = __FILE__;
+#endif
+
 #define SOCKET_TIMEOUT 2000000
+
+struct addrinfo {
+	int ai_flags;
+	int ai_family;
+	int ai_socktype;
+	int ai_protocol;
+	socklen_t ai_addrlen;
+	struct sockaddr *ai_addr;
+	char *ai_canonname;
+	struct addrinfo *ai_next;
+};
+
+typedef uint16_t in_port_t;
+typedef uint32_t in_addr_t;
+struct in_addr { in_addr_t s_addr; };
+
+struct sockaddr_in {
+	sa_family_t sin_family;
+	in_port_t sin_port;
+	struct in_addr sin_addr;
+	uint8_t sin_zero[8];
+};
+
+struct in6_addr
+{
+	union {
+		uint8_t __s6_addr[16];
+		uint16_t __s6_addr16[8];
+		uint32_t __s6_addr32[4];
+	} __in6_union;
+};
+//#define s6_addr __in6_union.__s6_addr
+//#define s6_addr16 __in6_union.__s6_addr16
+//#define s6_addr32 __in6_union.__s6_addr32
+
+struct sockaddr_in6
+{
+	sa_family_t     sin6_family;
+	in_port_t       sin6_port;
+	uint32_t        sin6_flowinfo;
+	struct in6_addr sin6_addr;
+	uint32_t        sin6_scope_id;
+};
+
+typedef struct socket_t {
+	int family;
+	int type;
+	int protocol;
+	int cepid;
+	int repid;
+	int backlog;
+	unsigned int flags;
+	union {
+		struct sockaddr_in laddr4;
+		struct sockaddr_in6 laddr6;
+	};
+	union {
+		struct sockaddr_in raddr4;
+		struct sockaddr_in6 raddr6;
+	};
+	int buf_size;
+	unsigned char *buf;
+	void *input;
+	int len;
+} socket_t;
 
 #define tcp6_cre_cep tcp_cre_cep
@@ -82,8 +149,4 @@
 #define tcp6_set_opt tcp_set_opt
 
-#define udp6_del_cep udp_del_cep
-#define udp6_get_opt udp_get_opt
-#define udp6_set_opt udp_set_opt
-
 #ifndef SUPPORT_INET6
 
@@ -93,6 +156,9 @@
 
 ER	udp6_cre_cep (ID cepid, T_UDP6_CCEP *pk_ccep) { return E_SYS; }
+ER	udp6_del_cep (ID cepid) { return E_SYS; }
 ER_UINT	udp6_snd_dat (ID cepid, T_IPV6EP *p_dstaddr, void *data, int_t len, TMO tmout) { return E_SYS; }
 ER_UINT	udp6_rcv_dat (ID cepid, T_IPV6EP *p_dstaddr, void *data, int_t len, TMO tmout) { return E_SYS; }
+ER	udp6_set_opt (ID cepid, int_t optname, void *optval, int_t optlen) { return E_SYS; }
+ER	udp6_get_opt (ID cepid, int_t optname, void *optval, int_t optlen) { return E_SYS; }
 
 const T_IN6_ADDR *in6_get_ifaddr (int_t index) { return NULL; }
@@ -111,4 +177,5 @@
 static int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg);
 static bool_t tcp_fd_readable(struct SHELL_FILE *fp);
+static bool_t tcp_fd_writable(struct SHELL_FILE *fp);
 static void tcp_fd_delete(struct SHELL_FILE *fp);
 
@@ -119,8 +186,9 @@
 static int udp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg);
 static bool_t udp_fd_readable(struct SHELL_FILE *fp);
+static bool_t udp_fd_writable(struct SHELL_FILE *fp);
 static void udp_fd_delete(struct SHELL_FILE *fp);
 
-IO_TYPE IO_TYPE_TCP = { tcp_fd_close, tcp_fd_read, tcp_fd_write, tcp_fd_seek, tcp_fd_ioctl, tcp_fd_readable, tcp_fd_delete };
-IO_TYPE IO_TYPE_UDP = { udp_fd_close, udp_fd_read, udp_fd_write, udp_fd_seek, udp_fd_ioctl, udp_fd_readable, udp_fd_delete };
+IO_TYPE IO_TYPE_TCP = { tcp_fd_close, tcp_fd_read, tcp_fd_write, tcp_fd_seek, tcp_fd_ioctl, tcp_fd_readable, tcp_fd_writable, tcp_fd_delete };
+IO_TYPE IO_TYPE_UDP = { udp_fd_close, udp_fd_read, udp_fd_write, udp_fd_seek, udp_fd_ioctl, udp_fd_readable, udp_fd_writable, udp_fd_delete };
 
 typedef struct id_table_t {
@@ -185,4 +253,15 @@
 
 #endif
+
+void addrcpy(void *_dst, const void *_src, int len)
+{
+#if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN
+	memcpy(_dst, _src, len);
+#else
+	uint8_t *dst = (uint8_t *)_dst, *src = &((uint8_t *)_src)[len];
+	while (src != _src)
+		*dst++ = *--src;
+#endif
+}
 
 ID new_id(id_table_t *table, int count)
@@ -347,12 +426,12 @@
 		}
 		case SOCK_DGRAM: {
-			ID cepid = new_id(udp_cepid_table, udp_cepid_table_count);
+			ID cepid = new_id(udp6_cepid_table, udp6_cepid_table_count);
 			if (cepid < 0)
 				return -ENOMEM;
 
-			T_UDP6_CCEP ccep = { 0, {ntohl(addr_in6->sin6_addr.__in6_union.__s6_addr), ntohs(addr_in6->sin6_port)}, (FP)socket_udp6_callback };
+			T_UDP6_CCEP ccep = { 0, { { ntohl(addr_in6->sin6_addr.__in6_union.__s6_addr) }, ntohs(addr_in6->sin6_port)}, (FP)socket_udp6_callback };
 			ret = udp6_cre_cep(cepid, &ccep);
 			if (ret != E_OK) {
-				delete_id(udp_cepid_table, udp_cepid_table_count, cepid);
+				delete_id(udp6_cepid_table, udp6_cepid_table_count, cepid);
 				return -ENOMEM;
 			}
@@ -407,5 +486,5 @@
 
 		struct sockaddr_in6 *laddr = &socket->laddr6;
-		T_TCP6_CREP crep = { 0, {ntohl(laddr->sin6_addr.__in6_union.__s6_addr), ntohs(laddr->sin6_port)} };
+		T_TCP6_CREP crep = { 0, { { ntohl(laddr->sin6_addr.__in6_union.__s6_addr) }, ntohs(laddr->sin6_port)} };
 		ret = tcp6_cre_rep(repid, &crep);
 		if (ret != E_OK) {
@@ -423,5 +502,5 @@
 }
 
-int shell_connect(int fd, const struct sockaddr *addr, socklen_t len)
+int shell_connect(int fd, const struct sockaddr *addr, socklen_t alen)
 {
 	SOCKET *fp = fd_to_fp(fd);
@@ -435,5 +514,5 @@
 	switch (socket->family) {
 	case AF_INET: {
-		if (len < 8) {
+		if (alen < sizeof(struct sockaddr_in)) {
 			return -EINVAL;
 		}
@@ -455,14 +534,17 @@
 			}
 			fp->handle = cepid;
+			fp->writable = 1;
 			socket->cepid = cepid;
 		}
 		struct sockaddr_in *laddr = &socket->laddr4;
 		struct sockaddr_in *raddr = &socket->raddr4;
-		memset(raddr, 0, sizeof(*raddr));
-		memcpy(raddr, addr, len);
+		memcpy(raddr, addr, sizeof(struct sockaddr_in));
 		T_IPV4EP lep = { ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port) };
 		T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) };
 		ret = tcp_con_cep(socket->cepid, &lep, &rep, SOCKET_TIMEOUT);
-		if (ret < 0) {
+		if (ret == E_TMOUT) {
+			return -ETIMEDOUT;
+		}
+		else if (ret < 0) {
 			return -EHOSTUNREACH;
 		}
@@ -470,5 +552,5 @@
 	}
 	case AF_INET6: {
-		if (len < 20) {
+		if (alen < sizeof(struct sockaddr_in6)) {
 			return -EINVAL;
 		}
@@ -490,14 +572,21 @@
 			}
 			fp->handle = cepid;
+			fp->writable = 1;
 			socket->cepid = cepid;
 		}
 		struct sockaddr_in6 *laddr = &socket->laddr6;
 		struct sockaddr_in6 *raddr = &socket->raddr6;
-		memset(raddr, 0, sizeof(*raddr));
-		memcpy(raddr, addr, len);
-		T_IPV6EP lep = { ntohl(laddr->sin6_addr.__in6_union.__s6_addr), ntohs(laddr->sin6_port) };
-		T_IPV6EP rep = { ntohl(raddr->sin6_addr.__in6_union.__s6_addr), ntohs(raddr->sin6_port) };
+		memcpy(raddr, addr, sizeof(struct sockaddr_in6));
+		T_IPV6EP lep;
+		addrcpy(&lep.ipaddr, &laddr->sin6_addr, 16);
+		lep.portno = ntohs(laddr->sin6_port);
+		T_IPV6EP rep;
+		addrcpy(&rep.ipaddr, &raddr->sin6_addr, 16);
+		rep.portno = ntohs(raddr->sin6_port);
 		ret = tcp6_con_cep(socket->cepid, &lep, &rep, SOCKET_TIMEOUT);
-		if (ret < 0) {
+		if (ret == E_TMOUT) {
+			return -ETIMEDOUT;
+		}
+		else if (ret < 0) {
 			return -EHOSTUNREACH;
 		}
@@ -508,8 +597,10 @@
 	}
 
+	if (fp->writeevt_w != fp->writeevt_r) fp->writeevt_r++;
+
 	return 0;
 }
 
-int shell_accept(int fd, struct sockaddr *__restrict addr, socklen_t *__restrict len)
+int shell_accept(int fd, struct sockaddr *__restrict addr, socklen_t *__restrict alen)
 {
 	SOCKET *lfp = fd_to_fp(fd);
@@ -550,4 +641,5 @@
 			}
 			fp->handle = cepid;
+			fp->writable = 1;
 			socket->cepid = cepid;
 		}
@@ -555,4 +647,5 @@
 			cepid = ((socket_t *)lfp->exinf)->cepid;
 			fp->handle = cepid;
+			fp->writable = 1;
 			lfp->handle = tmax_tcp_cepid + ((socket_t *)lfp->exinf)->repid;
 			((socket_t *)lfp->exinf)->cepid = 0;
@@ -566,19 +659,19 @@
 		}
 		struct sockaddr_in *raddr = &socket->raddr4;
-		memset(raddr, 0, sizeof(*raddr));
+		memset(raddr, 0, sizeof(struct sockaddr_in));
 		raddr->sin_family = AF_INET;
 		raddr->sin_port = htons(rep.portno);
 		raddr->sin_addr.s_addr = htonl(rep.ipaddr);
 
-		if (addr != NULL && len != NULL) {
-			int sz = *len;
-			if (sz < 8) {
+		if (addr != NULL && alen != NULL) {
+			int sz = *alen;
+			if (sz < sizeof(struct sockaddr_in)) {
 				return -EINVAL;
 			}
 			struct sockaddr_in *raddr = &socket->raddr4;
-			if (sz > sizeof(*raddr))
-				sz = sizeof(*raddr);
+			if (sz > sizeof(struct sockaddr_in))
+				sz = sizeof(struct sockaddr_in);
 			memcpy(addr, raddr, sz);
-			*len = sizeof(*raddr);
+			*alen = sz;
 		}
 		break;
@@ -603,4 +696,5 @@
 			}
 			fp->handle = cepid;
+			fp->writable = 1;
 			socket->cepid = cepid;
 		}
@@ -608,4 +702,5 @@
 			cepid = ((socket_t *)lfp->exinf)->cepid;
 			fp->handle = cepid;
+			fp->writable = 1;
 			lfp->handle = tmax_tcp6_cepid + ((socket_t *)lfp->exinf)->repid;
 			((socket_t *)lfp->exinf)->cepid = 0;
@@ -613,5 +708,5 @@
 			((socket_t *)lfp->exinf)->buf = 0;
 		}
-		T_IPV6EP rep = { 0, 0 };
+		T_IPV6EP rep = { { 0 }, 0 };
 		ret = tcp6_acp_cep(socket->cepid, socket->repid, &rep, TMO_FEVR);
 		if (ret < 0) {
@@ -619,24 +714,19 @@
 		}
 		struct sockaddr_in6 *raddr = &socket->raddr6;
-		memset(raddr, 0, sizeof(*raddr));
+		memset(raddr, 0, sizeof(struct sockaddr_in6));
 		raddr->sin6_family = AF_INET;
 		raddr->sin6_port = htons(rep.portno);
-#if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN
-		memcpy(raddr->sin6_addr.__in6_union.__s6_addr, rep.ipaddr.__u6_addr.__u6_addr8, 16);
-#else
-		for (int i = 0; i < 16; i++)
-			raddr->sin6_addr.__in6_union.__s6_addr[i] = rep.ipaddr.__u6_addr.__u6_addr8[i];
-#endif
-
-		if (addr != NULL && len != NULL) {
-			int sz = *len;
-			if (sz < 8) {
+		addrcpy(&raddr->sin6_addr, &rep.ipaddr, 16);
+
+		if (addr != NULL && alen != NULL) {
+			int sz = *alen;
+			if (sz < sizeof(struct sockaddr_in6)) {
 				return -EINVAL;
 			}
 			struct sockaddr_in6 *raddr = &socket->raddr6;
-			if (sz > sizeof(*raddr))
-				sz = sizeof(*raddr);
+			if (sz > sizeof(struct sockaddr_in6))
+				sz = sizeof(struct sockaddr_in6);
 			memcpy(addr, raddr, sz);
-			*len = sizeof(*raddr);
+			*alen = sz;
 		}
 		break;
@@ -645,4 +735,6 @@
 		return -ENOPROTOOPT;
 	}
+
+	if (fp->writeevt_w != fp->writeevt_r) fp->writeevt_r++;
 
 	return fp->fd;
@@ -673,10 +765,9 @@
 			}
 			else {
+				int temp = len;
 				for (;;) {
 					ret = tcp_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT);
 					if (ret < 0) {
-						if (ret == E_TMOUT)
-							return -ETIME;
-						return -ECOMM;
+						return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
 					}
 					len -= ret;
@@ -685,20 +776,19 @@
 					buf = (const void *)&((uint8_t *)buf)[ret];
 				} 
+				ret = temp;
 			}
 			break;
 		}
 		case SOCK_DGRAM: {
-			int sz = alen;
-			if ((addr == NULL) || (sz < 8)) {
+			if ((addr == NULL) || (alen < sizeof(struct sockaddr_in))) {
 				return -EINVAL;
 			}
 			struct sockaddr_in *raddr = &socket->raddr4;
-			memset(raddr, 0, sizeof(*raddr));
-			memcpy(raddr, addr, sz);
+			memcpy(raddr, addr, sizeof(struct sockaddr_in));
 			T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) };
 			ret = udp_snd_dat(socket->cepid, &rep, (void *)buf, len,
 				(socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
 			if (ret < 0) {
-				return (ret == E_TMOUT) ? -ETIME : -ECOMM;
+				return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
 			}
 			break;
@@ -721,10 +811,9 @@
 			}
 			else {
+				int temp = len;
 				for (;;) {
 					ret = tcp6_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT);
 					if (ret < 0) {
-						if (ret == E_TMOUT)
-							return -ETIME;
-						return -ECOMM;
+						return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
 					}
 					len -= ret;
@@ -732,21 +821,22 @@
 						break;
 					buf = (const void *)&((uint8_t *)buf)[ret];
-				} 
+				}
+				ret = temp;
 			}
 			break;
 		}
 		case SOCK_DGRAM: {
-			int sz = alen;
-			if ((addr == NULL) || (sz < 8)) {
+			if ((addr == NULL) || (alen < sizeof(struct sockaddr_in6))) {
 				return -EINVAL;
 			}
 			struct sockaddr_in6 *raddr = &socket->raddr6;
-			memset(raddr, 0, sizeof(*raddr));
-			memcpy(raddr, addr, sz);
-			T_IPV6EP rep = { ntohl(raddr->sin6_addr.__in6_union.__s6_addr), ntohs(raddr->sin6_port) };
+			memcpy(raddr, addr, sizeof(struct sockaddr_in6));
+			T_IPV6EP rep;
+			addrcpy(&rep.ipaddr, &raddr->sin6_addr, 16);
+			rep.portno = ntohs(raddr->sin6_port);
 			ret = udp6_snd_dat(socket->cepid, &rep, (void *)buf, len,
 				(socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
 			if (ret < 0) {
-				return (ret == E_TMOUT) ? -ETIME : -ECOMM;
+				return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
 			}
 			break;
@@ -758,4 +848,6 @@
 		return -ENOPROTOOPT;
 	}
+
+	if (fp->writeevt_w != fp->writeevt_r) fp->writeevt_r++;
 
 	return ret;
@@ -800,8 +892,10 @@
 						syslog(LOG_ERROR, "sig_sem => %d", ret);
 					}
-					ret = tcp_rcv_buf(socket->cepid, &socket->input, TMO_FEVR);
+					ret = tcp_rcv_buf(socket->cepid, &socket->input,
+						(socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
 					if (ret < 0) {
-						syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret);
-						return -ECOMM;
+						if ((socket->flags & O_NONBLOCK) == 0)
+							syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret);
+						return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
 					}
 					rsz = ret;
@@ -858,5 +952,5 @@
 					if ((socket->flags & O_NONBLOCK) == 0)
 						syslog(LOG_ERROR, "udp_rcv_buf => %d", ret);
-					return (ret == E_TMOUT) ? -ETIME : -ECOMM;
+					return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
 				}
 				rsz = ret;
@@ -867,10 +961,10 @@
 					}
 					int sz = *alen;
-					memset(raddr, 0, sizeof(socket->raddr4));
+					memset(raddr, 0, sizeof(struct sockaddr_in));
 					raddr->sin_family = AF_INET;
 					raddr->sin_port = htons(rep.portno);
 					raddr->sin_addr.s_addr = htonl(rep.ipaddr);
-					if (sz > sizeof(socket->raddr4))
-						sz = sizeof(socket->raddr4);
+					if (sz > sizeof(struct sockaddr_in))
+						sz = sizeof(struct sockaddr_in);
 					memcpy(addr, raddr, sz);
 					*alen = sz;
@@ -889,6 +983,6 @@
 				if ((addr != NULL) && (alen != NULL)) {
 					int sz = *alen;
-					if (sz > sizeof(socket->raddr4))
-						sz = sizeof(socket->raddr4);
+					if (sz > sizeof(struct sockaddr_in))
+						sz = sizeof(struct sockaddr_in);
 					memcpy(addr, raddr, sz);
 					*alen = sz;
@@ -934,8 +1028,10 @@
 						syslog(LOG_ERROR, "sig_sem => %d", ret);
 					}
-					ret = tcp6_rcv_buf(socket->cepid, &socket->input, TMO_FEVR);
+					ret = tcp6_rcv_buf(socket->cepid, &socket->input,
+						(socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
 					if (ret < 0) {
-						syslog(LOG_ERROR, "tcp6_rcv_buf => %d", ret);
-						return -ECOMM;
+						if ((socket->flags & O_NONBLOCK) == 0)
+							syslog(LOG_ERROR, "tcp6_rcv_buf => %d", ret);
+						return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
 					}
 					rsz = ret;
@@ -986,5 +1082,5 @@
 				}
 
-				T_IPV6EP rep = { 0, 0 };
+				T_IPV6EP rep = { { 0 }, 0 };
 				ret = udp6_rcv_dat(socket->cepid, &rep, buf, len,
 					(socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
@@ -992,5 +1088,5 @@
 					if ((socket->flags & O_NONBLOCK) == 0)
 						syslog(LOG_ERROR, "udp6_rcv_buf => %d", ret);
-					return (ret == E_TMOUT) ? -ETIME : -ECOMM;
+					return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
 				}
 				rsz = ret;
@@ -1001,15 +1097,10 @@
 					}
 					int sz = *alen;
-					memset(raddr, 0, sizeof(socket->raddr6));
+					memset(raddr, 0, sizeof(struct sockaddr_in6));
 					raddr->sin6_family = AF_INET;
 					raddr->sin6_port = htons(rep.portno);
-#if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN
-					memcpy(raddr->sin6_addr.__in6_union.__s6_addr, rep.ipaddr.__u6_addr.__u6_addr8, 16);
-#else
-					for (int i = 0; i < 16; i++)
-						raddr->sin6_addr.__in6_union.__s6_addr[i] = rep.ipaddr.__u6_addr.__u6_addr8[i];
-#endif
-					if (sz > sizeof(socket->raddr6))
-						sz = sizeof(socket->raddr6);
+					addrcpy(&raddr->sin6_addr, &rep.ipaddr, 16);
+					if (sz > sizeof(struct sockaddr_in6))
+						sz = sizeof(struct sockaddr_in6);
 					memcpy(addr, raddr, sz);
 					*alen = sz;
@@ -1028,6 +1119,6 @@
 				if ((addr != NULL) && (alen != NULL)) {
 					int sz = *alen;
-					if (sz > sizeof(socket->raddr6))
-						sz = sizeof(socket->raddr6);
+					if (sz > sizeof(struct sockaddr_in6))
+						sz = sizeof(struct sockaddr_in6);
 					memcpy(addr, raddr, sz);
 					*alen = sz;
@@ -1054,4 +1145,6 @@
 		return -ENOPROTOOPT;
 	}
+
+	if (fp->readevt_w != fp->readevt_r) fp->readevt_r++;
 
 	return ret;
@@ -1427,10 +1520,5 @@
 		struct sockaddr_in6 laddr;
 		laddr.sin6_family = AF_INET;
-#if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN
-		memcpy(laddr.sin6_addr.__in6_union.__s6_addr, laddr6->__u6_addr.__u6_addr8, 16);
-#else
-		for (int i = 0; i < 16; i++)
-			laddr.sin6_addr.__in6_union.__s6_addr[i] = laddr6->__u6_addr.__u6_addr8[i];
-#endif
+		addrcpy(&laddr.sin6_addr, laddr6, 16);
 		laddr.sin6_port = socket->laddr6.sin6_port;
 		*len = sizeof(struct sockaddr_in6);
@@ -1465,5 +1553,5 @@
 			delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid);
 			if ((ret < 0) || (ret2 < 0)) {
-				return (ret == E_TMOUT) ? -ETIME : -EINVAL;
+				return (ret == E_TMOUT) ? -ETIMEDOUT : -EIO;
 			}
 		}
@@ -1494,5 +1582,5 @@
 			delete_id(tcp6_cepid_table, tcp6_cepid_table_count, cepid);
 			if ((ret < 0) || (ret2 < 0)) {
-				return (ret == E_TMOUT) ? -ETIME : -EINVAL;
+				return (ret == E_TMOUT) ? -ETIMEDOUT : -EIO;
 			}
 		}
@@ -1535,4 +1623,14 @@
 int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg)
 {
+	socket_t *socket = (socket_t *)fp->exinf;
+
+	switch (req) {
+	case F_GETFL:
+		return socket->flags;
+	case F_SETFL:
+		socket->flags = (unsigned int)arg;
+		return 0;
+	}
+
 	return -EINVAL;
 }
@@ -1571,4 +1669,11 @@
 }
 
+bool_t tcp_fd_writable(struct SHELL_FILE *fp)
+{
+	//socket_t *socket = (socket_t *)fp->exinf;
+
+	return /*fp->writable &&*/ (fp->writeevt_w == fp->writeevt_r);
+}
+
 void tcp_fd_delete(struct SHELL_FILE *fp)
 {
@@ -1590,4 +1695,5 @@
 		return E_PAR;
 
+	socket_t *socket = (socket_t *)fp->exinf;
 	int fd = fp->fd;
 	FD_SET(fd, (fd_set *)&flgptn);
@@ -1603,5 +1709,4 @@
 			syslog(LOG_ERROR, "wai_sem => %d", ret);
 		}
-		socket_t *socket = (socket_t *)fp->exinf;
 		socket->len += len;
 		ret = sig_sem(SEM_FILEDESC);
@@ -1670,4 +1775,5 @@
 		return E_PAR;
 
+	socket_t *socket = (socket_t *)fp->exinf;
 	int fd = fp->fd;
 	FD_SET(fd, (fd_set *)&flgptn);
@@ -1683,5 +1789,4 @@
 			syslog(LOG_ERROR, "wai_sem => %d", ret);
 		}
-		socket_t *socket = (socket_t *)fp->exinf;
 		socket->len += len;
 		ret = sig_sem(SEM_FILEDESC);
@@ -1806,4 +1911,11 @@
 }
 
+bool_t udp_fd_writable(struct SHELL_FILE *fp)
+{
+	//socket_t *socket = (socket_t *)fp->exinf;
+
+	return fp->writable && (fp->writeevt_w == fp->writeevt_r);
+}
+
 void udp_fd_delete(struct SHELL_FILE *fp)
 {
@@ -1849,5 +1961,5 @@
 		socket->input = udppara->input;
 		socket->buf = GET_UDP_SDU(udppara->input, udppara->off);
-		memset(&socket->raddr4, 0, sizeof(socket->raddr4));
+		memset(&socket->raddr4, 0, sizeof(struct sockaddr_in));
 		socket->raddr4.sin_family = AF_INET;
 		socket->raddr4.sin_port = htons(udppara->rep4.portno);
@@ -1932,13 +2044,8 @@
 		socket->input = udppara->input;
 		socket->buf = GET_UDP_SDU(udppara->input, udppara->off);
-		memset(&socket->raddr6, 0, sizeof(socket->raddr6));
+		memset(&socket->raddr6, 0, sizeof(struct sockaddr_in6));
 		socket->raddr6.sin6_family = AF_INET;
 		socket->raddr6.sin6_port = htons(udppara->rep6.portno);
-#if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN
-		memcpy(socket->raddr6.sin6_addr.__in6_union.__s6_addr, udppara->rep6.ipaddr.__u6_addr.__u6_addr8, 16);
-#else
-		for (int i = 0; i < 16; i++)
-			socket->raddr6.sin6_addr.__in6_union.__s6_addr[i] = udppara->rep6.ipaddr.__u6_addr.__u6_addr8[i];
-#endif
+		addrcpy(&socket->raddr6.sin6_addr, &udppara->rep6.ipaddr, 16);
 		udppara->input->flags |= NB_FLG_NOREL_IFOUT;
 		ret = sig_sem(SEM_FILEDESC);
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/socket_stub.h
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/socket_stub.h	(revision 374)
+++ 	(revision )
@@ -1,156 +1,0 @@
-/*
- *  TOPPERS ECHONET Lite Communication Middleware
- * 
- *  Copyright (C) 2017 Cores Co., Ltd. Japan
- * 
- *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
- *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
- *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
- *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
- *      スコード中に含まれていること．
- *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
- *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
- *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
- *      の無保証規定を掲載すること．
- *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
- *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
- *      と．
- *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
- *        作権表示，この利用条件および下記の無保証規定を掲載すること．
- *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
- *        報告すること．
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
- *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
- *      免責すること．
- * 
- *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
- *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
- *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
- *  の責任を負わない．
- * 
- *  @(#) $Id$
- */
-#ifndef SOCKET_STUB_H
-#define SOCKET_STUB_H
-
-struct addrinfo {
-	int ai_flags;
-	int ai_family;
-	int ai_socktype;
-	int ai_protocol;
-	socklen_t ai_addrlen;
-	struct sockaddr *ai_addr;
-	char *ai_canonname;
-	struct addrinfo *ai_next;
-};
-
-typedef uint16_t in_port_t;
-typedef uint32_t in_addr_t;
-struct in_addr { in_addr_t s_addr; };
-
-struct sockaddr_in {
-	sa_family_t sin_family;
-	in_port_t sin_port;
-	struct in_addr sin_addr;
-	uint8_t sin_zero[8];
-};
-
-struct in6_addr
-{
-	union {
-		uint8_t __s6_addr[16];
-		uint16_t __s6_addr16[8];
-		uint32_t __s6_addr32[4];
-	} __in6_union;
-};
-//#define s6_addr __in6_union.__s6_addr
-//#define s6_addr16 __in6_union.__s6_addr16
-//#define s6_addr32 __in6_union.__s6_addr32
-
-struct sockaddr_in6
-{
-	sa_family_t     sin6_family;
-	in_port_t       sin6_port;
-	uint32_t        sin6_flowinfo;
-	struct in6_addr sin6_addr;
-	uint32_t        sin6_scope_id;
-};
-
-typedef struct socket_t {
-	int family;
-	int type;
-	int protocol;
-	int cepid;
-	int repid;
-	int backlog;
-	unsigned int flags;
-	union {
-		struct sockaddr_in laddr4;
-		struct sockaddr_in6 laddr6;
-	};
-	union {
-		struct sockaddr_in raddr4;
-		struct sockaddr_in6 raddr6;
-	};
-	int buf_size;
-	unsigned char *buf;
-	void *input;
-	int len;
-} socket_t;
-
-struct SHELL_DIR {
-	FATFS_DIR dir;
-	struct dirent dirent;
-};
-
-typedef const struct io_type_s IO_TYPE;
-
-struct SHELL_FILE {
-	int fd;
-	IO_TYPE *type;
-	int handle;
-	int readevt_r;
-	int readevt_w;
-	int writeevt_r;
-	int writeevt_w;
-	int writable;
-	int errorevt_r;
-	int errorevt_w;
-	void *exinf;
-};
-
-struct io_type_s {
-	int (*close)(struct SHELL_FILE *);
-	size_t (*read)(struct SHELL_FILE *, unsigned char *, size_t);
-	size_t (*write)(struct SHELL_FILE *, const unsigned char *, size_t);
-	off_t (*seek)(struct SHELL_FILE *, off_t, int);
-	int (*ioctl)(struct SHELL_FILE *, int, void *);
-	bool_t (*readable)(struct SHELL_FILE *);
-	void (*delete)(struct SHELL_FILE *);
-};
-
-#ifndef bool
-#define bool int
-#endif
-#ifndef true
-#define true 1
-#endif
-#ifndef false
-#define false 0
-#endif
-
-struct SHELL_FILE *new_fp(IO_TYPE *type, int id, int writable);
-int delete_fd_by_id(IO_TYPE *type, int id);
-struct SHELL_FILE *fd_to_fp(int fd);
-struct SHELL_FILE *id_to_fd(IO_TYPE *type, int id);
-
-int delete_fp(struct SHELL_FILE *fp);
-void clean_fd();
-
-void sys_tlsf_init(void);
-
-#endif // !SOCKET_STUB_H
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/stdio_stub.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/stdio_stub.c	(revision 387)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/stdio_stub.c	(revision 387)
@@ -0,0 +1,629 @@
+/*
+ *  TOPPERS ECHONET Lite Communication Middleware
+ * 
+ *  Copyright (C) 2017-2019 Cores Co., Ltd. Japan
+ * 
+ *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
+ *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+ *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+ *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+ *      スコード中に含まれていること．
+ *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+ *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+ *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+ *      の無保証規定を掲載すること．
+ *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+ *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+ *      と．
+ *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+ *        作権表示，この利用条件および下記の無保証規定を掲載すること．
+ *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+ *        報告すること．
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+ *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること．
+ * 
+ *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+ *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+ *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+ *  の責任を負わない．
+ * 
+ *  @(#) $Id$
+ */
+#include "shellif.h"
+#include <stdint.h>
+#include <kernel.h>
+#include <t_syslog.h>
+#include <t_stdlib.h>
+#include <sil.h>
+#include "syssvc/serial.h"
+#include "syssvc/syslog.h"
+#include "target_syssvc.h"
+#include "target_serial.h"
+#include "fdtable.h"
+#include "kernel_cfg.h"
+#include <string.h>
+#include <errno.h>
+#include "util/ntstdio.h"
+#include "hal/serial_api.h"
+#include "target_rename.h"
+#include "target_kernel_impl.h"
+#include "syssvc/siofd.h"
+
+#ifdef _DEBUG
+static const char THIS_FILE[] = __FILE__;
+#endif
+
+static unsigned char stdio_xi(struct ntstdio_t *handle);
+static void stdio_xo(struct ntstdio_t *handle, unsigned char c);
+static void stdio_serial_irq_handler(uint32_t id, SerialIrq event);
+
+static int stdio_close(struct SHELL_FILE *fp);
+static size_t stdio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
+static size_t stdio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
+static void stdio_delete(struct SHELL_FILE *fp);
+
+static unsigned char sio_xi(struct ntstdio_t *handle);
+static void sio_xo(struct ntstdio_t *handle, unsigned char c);
+static void sio_serial_irq_handler(uint32_t id, SerialIrq event);
+
+static int sio_close(struct SHELL_FILE *fp);
+static size_t sio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
+static size_t sio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
+static off_t sio_seek(struct SHELL_FILE *fp, off_t ofs, int org);
+static int sio_ioctl(struct SHELL_FILE *fp, int req, void *arg);
+static bool_t sio_readable(struct SHELL_FILE *fp);
+static bool_t sio_writable(struct SHELL_FILE *fp);
+static void sio_delete(struct SHELL_FILE *fp);
+
+IO_TYPE IO_TYPE_STDIN = { stdio_close, sio_read, stdio_write, sio_seek, sio_ioctl, sio_readable, sio_writable, stdio_delete };
+IO_TYPE IO_TYPE_STDOUT = { stdio_close, stdio_read, sio_write, sio_seek, sio_ioctl, sio_readable, sio_writable, stdio_delete };
+IO_TYPE IO_TYPE_STDERR = { stdio_close, stdio_read, sio_write, sio_seek, sio_ioctl, sio_readable, sio_writable, stdio_delete };
+IO_TYPE IO_TYPE_SIO = { sio_close, sio_read, sio_write, sio_seek, sio_ioctl, sio_readable, sio_writable, sio_delete };
+
+#define STDIO_UART_BUF_SZ 256
+
+typedef struct stdio_sio_t {
+	serial_t serial;
+	ntstdio_t ntstdio;
+	struct SHELL_FILE *fp;
+	unsigned char tx_buf[STDIO_UART_BUF_SZ];
+	int tx_pos_w;
+	int tx_pos_r;
+	unsigned char rx_buf[STDIO_UART_BUF_SZ];
+	int rx_pos_w;
+	int rx_pos_r;
+} stdio_sio_t;
+
+stdio_sio_t stdio_sio;
+
+void sys_init(intptr_t exinf)
+{
+	serial_t *serial = &stdio_sio.serial;
+	ntstdio_t *ntstdio = &stdio_sio.ntstdio;
+
+	serial_init(serial, STDIO_UART_TX, STDIO_UART_RX);
+	serial_baud(serial, UART_BAUDRATE);
+	serial_format(serial, 8, ParityNone, 1);
+
+	ntstdio_init(ntstdio, NTSTDIO_OPTION_LINE_ECHO | NTSTDIO_OPTION_CANON | NTSTDIO_OPTION_LF_CRLF | NTSTDIO_OPTION_LF_CR, stdio_xi, stdio_xo);
+	ntstdio->exinf = (void *)&stdio_sio;
+
+	struct SHELL_FILE *fp;
+
+	fp = fd_to_fp(STDIN_FILENO);
+	fp->handle = SIO_PORTID;
+	fp->exinf = (void *)ntstdio;
+
+	fp = fd_to_fp(STDOUT_FILENO);
+	fp->handle = SIO_PORTID;
+	fp->exinf = (void *)ntstdio;
+
+	fp = fd_to_fp(STDERR_FILENO);
+	fp->handle = SIO_PORTID;
+	fp->exinf = (void *)ntstdio;
+
+	serial_irq_handler(&stdio_sio.serial, stdio_serial_irq_handler, 0);
+
+	serial_irq_set(serial, RxIrq, true);
+}
+
+ID serial_portid;
+
+void stdio_open(ID portid)
+{
+	struct SHELL_FILE *fp;
+
+	serial_portid = portid;
+	serial_ctl_por(portid, IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV);
+
+	fp = fd_to_fp(STDIN_FILENO);
+	fp->handle = portid;
+
+	fp = fd_to_fp(STDOUT_FILENO);
+	fp->handle = portid;
+
+	fp = fd_to_fp(STDERR_FILENO);
+	fp->handle = portid;
+}
+
+int stdio_close(struct SHELL_FILE *fp)
+{
+	return -EPERM;
+}
+
+size_t stdio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
+{
+	return -EPERM;
+}
+
+size_t stdio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
+{
+	return -EPERM;
+}
+
+void stdio_delete(struct SHELL_FILE *fp)
+{
+}
+
+int sio_close(struct SHELL_FILE *fp)
+{
+	return -EPERM;
+}
+
+size_t sio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
+{
+	int i = 0;
+	while (i < len) {
+		int c = ntstdio_getc((struct ntstdio_t *)fp->exinf);
+		data[i++] = c;
+		if ((c == EOF) || (c == '\n'))
+			break;
+	}
+	return i;
+}
+
+size_t sio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
+{
+	for (int i = 0; i < len; i++) {
+		ntstdio_putc((struct ntstdio_t *)fp->exinf, data[i]);
+	}
+	return len;
+}
+
+off_t sio_seek(struct SHELL_FILE *fp, off_t ofs, int org)
+{
+	return -EPERM;
+}
+
+int sio_tcgetattr(struct SHELL_FILE *fp, struct termios *termios)
+{
+	ntstdio_t *ntstdio = (ntstdio_t *)fp->exinf;
+
+	memset(termios, 0, sizeof(*termios));
+
+	if (ntstdio->option & NTSTDIO_OPTION_LINE_ECHO) {
+		termios->c_lflag |= ECHO;
+	}
+	else {
+		termios->c_lflag &= ~ECHO;
+	}
+	if (ntstdio->option & NTSTDIO_OPTION_CANON) {
+		termios->c_lflag |= ICANON;
+	}
+	else {
+		termios->c_lflag &= ~ICANON;
+	}
+	if (ntstdio->option & NTSTDIO_OPTION_LF_CR) {
+		termios->c_iflag |= INLCR;
+	}
+	else {
+		termios->c_iflag &= ~INLCR;
+	}
+	if (ntstdio->option & NTSTDIO_OPTION_LF_CRLF) {
+		termios->c_oflag |= ONLCR;
+	}
+	else {
+		termios->c_oflag &= ~ONLCR;
+	}
+
+	return 0;
+}
+
+int sio_tcsetattr(struct SHELL_FILE *fp, int optional_actions, const struct termios *termios)
+{
+	ntstdio_t *ntstdio = (ntstdio_t *)fp->exinf;
+
+	if (optional_actions == TCSANOW) {
+		if (termios->c_lflag & ECHO) {
+			ntstdio->option |= NTSTDIO_OPTION_LINE_ECHO;
+		}
+		else {
+			ntstdio->option &= ~NTSTDIO_OPTION_LINE_ECHO;
+		}
+		if (termios->c_lflag & ICANON) {
+			ntstdio->option |= NTSTDIO_OPTION_CANON;
+		}
+		else {
+			ntstdio->option &= ~NTSTDIO_OPTION_CANON;
+		}
+		if (termios->c_iflag & INLCR) {
+			ntstdio->option |= NTSTDIO_OPTION_LF_CR;
+		}
+		else {
+			ntstdio->option &= ~NTSTDIO_OPTION_LF_CR;
+		}
+		if (termios->c_oflag & ONLCR) {
+			ntstdio->option |= NTSTDIO_OPTION_LF_CRLF;
+		}
+		else {
+			ntstdio->option &= ~NTSTDIO_OPTION_LF_CRLF;
+		}
+		return 0;
+	}
+
+	//shell_abort();
+	return 0;
+}
+
+int sio_ioctl(struct SHELL_FILE *fp, int request, void *arg)
+{
+	if ((fp == NULL) || (fp->type != &IO_TYPE_SIO))
+		return -EBADF;
+
+	switch (request) {
+	case TIOCGWINSZ:
+		return 0;
+	case TCGETS:
+		return sio_tcgetattr(fp, (struct termios *)arg);
+	case TCSETS + TCSANOW:
+	case TCSETS + TCSADRAIN:
+	case TCSETS + TCSAFLUSH:
+		return sio_tcsetattr(fp, request - TCSETS, (const struct termios *)arg);
+	}
+
+	return -EINVAL;
+}
+
+bool_t sio_readable(struct SHELL_FILE *fp)
+{
+	return fp->readevt_w != fp->readevt_r;
+}
+
+bool_t sio_writable(struct SHELL_FILE *fp)
+{
+	return fp->writable && (fp->writeevt_w == fp->writeevt_r);
+}
+
+void sio_delete(struct SHELL_FILE *fp)
+{
+	free((stdio_sio_t *)((struct ntstdio_t *)fp->exinf)->exinf);
+	((struct ntstdio_t *)fp->exinf)->exinf = NULL;
+	free((struct ntstdio_t *)fp->exinf);
+	fp->exinf = NULL;
+}
+
+static unsigned char ntstdio_xi(struct ntstdio_t *handle, struct SHELL_FILE *fp)
+{
+	stdio_sio_t *uart = (stdio_sio_t *)handle->exinf;
+	ER ret;
+	unsigned char c;
+
+	bool_t lock = sense_lock();
+	if (lock)
+		unl_cpu();
+
+	while (uart->rx_pos_w == uart->rx_pos_r) {
+		FLGPTN flgptn = 0, waitptn = 0;
+		FD_SET(fp->fd, (fd_set *)&waitptn);
+
+		ret = wai_flg(FLG_SELECT_WAIT, waitptn, TWF_ORW, &flgptn);
+		if (ret != E_OK) {
+			if (lock)
+				loc_cpu();
+			syslog(LOG_ERROR, "wai_flg => %d", ret);
+			return 0;
+		}
+
+		ret = clr_flg(FLG_SELECT_WAIT, ~(flgptn & waitptn));
+		if (ret != E_OK) {
+			syslog(LOG_ERROR, "clr_flg => %d", ret);
+		}
+	}
+
+	if (lock)
+		unl_cpu();
+
+	if (fp->readevt_w != fp->readevt_r) fp->readevt_r++;
+
+	c = uart->rx_buf[uart->rx_pos_r++];
+	if (uart->rx_pos_r >= sizeof(uart->rx_buf))
+		uart->rx_pos_r = 0;
+
+	return c;
+}
+
+extern volatile int ntshell_state;
+extern ID serial_portid;
+
+static void serial_rx_irq_handler(int fd)
+{
+	struct SHELL_FILE *fp = fd_to_fp(fd);
+	stdio_sio_t *uart = (stdio_sio_t *)((struct ntstdio_t *)fp->exinf)->exinf;
+	serial_t *serial = (serial_t *)&uart->serial;
+
+	if (serial_readable(serial)) {
+		unsigned char c = (unsigned char)serial_getc(serial);
+
+		if (ntshell_state == 1) {
+			ER ret;
+			FLGPTN flgptn = 0;
+
+			uart->rx_buf[uart->rx_pos_w++] = c;
+			if (uart->rx_pos_w >= sizeof(uart->rx_buf))
+				uart->rx_pos_w = 0;
+
+			if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
+
+			FD_SET(fd, (fd_set *)&flgptn);
+
+			ret = set_flg(FLG_SELECT_WAIT, flgptn);
+			if (ret != E_OK) {
+				syslog(LOG_ERROR, "set_flg => %d", ret);
+			}
+		}
+		else
+			sio_isr_rcv(fp->handle, c);
+	}
+}
+
+static void ntstdio_xo(struct ntstdio_t *handle, struct SHELL_FILE *fp, unsigned char c)
+{
+	stdio_sio_t *uart = (stdio_sio_t *)handle->exinf;
+	serial_t *serial = (serial_t *)&uart->serial;
+	ER ret;
+
+	// タスクコンテキストでない場合
+	if (sense_context()) {
+		// 送信可能になるまで待ち
+		while (!serial_writable(serial));
+		// 送信する
+		serial_putc(serial, c);
+		return;
+	}
+
+	// 送信バッファが空で
+	if (uart->tx_pos_w == uart->tx_pos_r) {
+		// 送信可能なら
+		if (serial_writable(serial)) {
+			// 送信する
+			serial_putc(serial, c);
+			return;
+		}
+	}
+
+	// 送信バッファに追加する
+	uart->tx_buf[uart->tx_pos_w++] = c;
+	if (uart->tx_pos_w >= sizeof(uart->tx_buf))
+		uart->tx_pos_w = 0;
+
+	// 送信可能になったら割り込みをもらうよう設定
+	serial_irq_set(serial, TxIrq, true);
+
+	bool_t lock = sense_lock();
+	if (lock)
+		unl_cpu();
+
+	do {
+		FLGPTN flgptn = 0, waitptn = 0;
+		FD_SET(fp->fd, (fd_set *)&waitptn);
+
+		ret = wai_flg(FLG_SELECT_WAIT, waitptn, TWF_ORW, &flgptn);
+		if (ret != E_OK) {
+			syslog(LOG_ERROR, "wai_flg => %d", ret);
+			break;
+		}
+
+		ret = clr_flg(FLG_SELECT_WAIT, ~(flgptn & waitptn));
+		if (ret != E_OK) {
+			syslog(LOG_ERROR, "clr_flg => %d", ret);
+		}
+	} while (fp->writeevt_w == fp->writeevt_r);
+
+	fp->writeevt_r++;
+
+	if (lock)
+		loc_cpu();
+}
+
+static void serial_tx_irq_handler(int fd)
+{
+	struct SHELL_FILE *fp = fd_to_fp(fd);
+	stdio_sio_t *uart = (stdio_sio_t *)((struct ntstdio_t *)fp->exinf)->exinf;
+	serial_t *serial = (serial_t *)&uart->serial;
+	ER ret;
+	unsigned char c;
+
+	if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
+
+	FLGPTN flgptn = 0;
+	FD_SET(fd, (fd_set *)&flgptn);
+
+	ret = set_flg(FLG_SELECT_WAIT, flgptn);
+	if (ret != E_OK) {
+		syslog(LOG_ERROR, "set_flg => %d", ret);
+	}
+
+	// 送信バッファが空なら
+	if (uart->tx_pos_w == uart->tx_pos_r) {
+		// SIOドライバの送信
+		sio_isr_snd(fp->handle);
+		// やっぱり送信バッファが空なら
+		if (uart->tx_pos_w == uart->tx_pos_r) {
+			// 送信割り込み停止
+			serial_irq_set(serial, TxIrq, false);
+			return;
+		}
+	}
+
+	c = uart->tx_buf[uart->tx_pos_r++];
+	if (uart->tx_pos_r >= sizeof(uart->tx_buf))
+		uart->tx_pos_r = 0;
+
+	// 送信する
+	serial_putc(serial, c);
+}
+
+void stdio_serial_irq_handler(uint32_t id, SerialIrq event)
+{
+	switch (event) {
+	case RxIrq:
+		serial_rx_irq_handler(STDIN_FILENO);
+		break;
+	case TxIrq:
+		serial_tx_irq_handler(STDOUT_FILENO);
+		break;
+	}
+}
+
+void sio_serial_irq_handler(uint32_t id, SerialIrq event)
+{
+	struct SHELL_FILE *fp = fd_to_fp(id);
+	if ((fp == NULL) || (fp->type != &IO_TYPE_SIO))
+		return;
+
+	switch (event) {
+	case RxIrq:
+		serial_rx_irq_handler(id);
+		break;
+	case TxIrq:
+		serial_tx_irq_handler(id);
+		break;
+	}
+}
+
+unsigned char stdio_xi(struct ntstdio_t *handle)
+{
+	return ntstdio_xi(handle, fd_to_fp(STDIN_FILENO));
+}
+
+void stdio_xo(struct ntstdio_t *handle, unsigned char c)
+{
+	ntstdio_xo(handle, fd_to_fp(STDOUT_FILENO), c);
+}
+
+unsigned char sio_xi(struct ntstdio_t *handle)
+{
+	return ntstdio_xi(handle, ((stdio_sio_t *)handle->exinf)->fp);
+}
+
+void sio_xo(struct ntstdio_t *handle, unsigned char c)
+{
+	ntstdio_xo(handle, ((stdio_sio_t *)handle->exinf)->fp, c);
+}
+
+int siofd_open(const char *path, int flags, ...)
+{
+	return -1;
+}
+
+int siofd_close(int fd)
+{
+	struct SHELL_FILE *fp = fd_to_fp(fd);
+	if ((fp == NULL) || (fp->type != &IO_TYPE_SIO)) {
+		errno = EBADF;
+		return -1;
+	}
+
+	errno = sio_close(fp);
+	if (errno != 0)
+		return 1;
+	return 0;
+}
+
+ssize_t siofd_read(int fd, void *data, size_t len)
+{
+	struct SHELL_FILE *fp = fd_to_fp(fd);
+	if ((fp == NULL) || ((fp->type != &IO_TYPE_STDIN) && (fp->type != &IO_TYPE_SIO))) {
+		errno = EBADF;
+		return -1;
+	}
+	char *pos, *end;
+
+	for (pos = (char *)data, end = &pos[len]; pos < end; pos++) {
+		*pos = ntstdio_xi((struct ntstdio_t *)fp->exinf, fp);
+	}
+
+	return pos - (char *)data;
+}
+
+ssize_t siofd_write(int fd, const void *data, size_t len)
+{
+	struct SHELL_FILE *fp = fd_to_fp(fd);
+	if ((fp == NULL) || ((fp->type != &IO_TYPE_STDOUT) && (fp->type != &IO_TYPE_STDERR)
+		&& (fp->type != &IO_TYPE_SIO))) {
+		errno = EBADF;
+		return -1;
+	}
+	const char *pos, *end;
+
+	for (pos = (const char *)data, end = &pos[len]; pos < end; pos++) {
+		ntstdio_xo((struct ntstdio_t *)fp->exinf, fp, *pos);
+	}
+
+	return pos - (char *)data;
+}
+
+int siofd_tcsetattr(int fd, int act, const struct termios *tio)
+{
+	struct SHELL_FILE *fp = fd_to_fp(fd);
+	if ((fp == NULL) || ((fp->type != &IO_TYPE_STDIN) && (fp->type != &IO_TYPE_STDOUT)
+		&& (fp->type != &IO_TYPE_STDERR) && (fp->type != &IO_TYPE_SIO))) {
+		errno = EBADF;
+		return -1;
+	}
+
+	errno = sio_tcsetattr(fp, act, tio);
+	if (errno != 0)
+		return 1;
+	return 0;
+}
+
+int siofd_tcgetattr(int fd, struct termios *tio)
+{
+	struct SHELL_FILE *fp = fd_to_fp(fd);
+	if ((fp == NULL) || ((fp->type != &IO_TYPE_STDIN) && (fp->type != &IO_TYPE_STDOUT)
+		&& (fp->type != &IO_TYPE_STDERR) && (fp->type != &IO_TYPE_SIO))) {
+		errno = EBADF;
+		return -1;
+	}
+
+	errno = sio_tcgetattr(fp, tio);
+	if (errno != 0)
+		return 1;
+	return 0;
+}
+
+int siofd_fcntl(int fd, int cmd, ...)
+{
+	struct SHELL_FILE *fp = fd_to_fp(fd);
+	if ((fp == NULL) || ((fp->type != &IO_TYPE_STDIN) && (fp->type != &IO_TYPE_STDOUT)
+		&& (fp->type != &IO_TYPE_STDERR) && (fp->type != &IO_TYPE_SIO))) {
+		errno = EBADF;
+		return -1;
+	}
+	void *arg;
+	va_list ap;
+	va_start(ap, cmd);
+	arg = va_arg(ap, void *);
+	va_end(ap);
+
+	errno = sio_ioctl(fp, cmd, arg);
+	if (errno != 0)
+		return 1;
+	return 0;
+}
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/syscall.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/syscall.c	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/syscall.c	(revision 387)
@@ -300,6 +300,6 @@
 }
 
-long SYS_rt_sigaction(long a, long b, long c) {
-	return shell_sigaction((int)a, (const struct sigaction *)b, (struct sigaction *)c);
+long SYS_rt_sigaction(long a, long b, long c, long d) {
+	return shell_sigaction((int)a, (const struct k_sigaction *)b, (struct k_sigaction *)c, (size_t)d);
 }
 
@@ -388,4 +388,9 @@
 }
 
+long SYS_nanosleep(long a, long b)
+{
+	return shell_nanosleep((const struct timespec *)a, (struct timespec *)b);
+}
+
 long SYS_dup()
 {
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/tSIOPortNTShell.cdl
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/tSIOPortNTShell.cdl	(revision 387)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/tSIOPortNTShell.cdl	(revision 387)
@@ -0,0 +1,119 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2015 by Ushio Laboratory
+ *              Graduate School of Engineering Science, Osaka Univ., JAPAN
+ *  Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は，以下の(1)〜(4)の条件を満たす場合に限り，本ソフトウェ
+ *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+ *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+ *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+ *      スコード中に含まれていること．
+ *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+ *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+ *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+ *      の無保証規定を掲載すること．
+ *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+ *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+ *      と．
+ *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+ *        作権表示，この利用条件および下記の無保証規定を掲載すること．
+ *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+ *        報告すること．
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+ *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること．
+ * 
+ *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+ *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+ *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+ *  の責任を負わない．
+ * 
+ *  $Id$
+ */
+
+/*
+ *		シリアルインタフェースドライバのターゲット依存部（NTShell用）
+ *		のコンポーネント記述
+ */
+
+/*
+ *  NTShell に関する定義
+ */
+import_C("termios.h");
+
+/*
+ *  SIOドライバの本体のセルタイプ
+ */
+celltype tSIOPortNTShellMain {
+	/*
+	 *  シリアルインタフェースドライバとの結合
+	 */
+	entry				sSIOPort		eSIOPort;
+	[optional] call		siSIOCBR		ciSIOCBR;
+
+	/*
+	 *  終了処理ルーチン
+	 */
+	entry	sRoutineBody	eTerminate;
+
+	attr {
+		const char	*path;				/* パス名 */
+	};
+
+	var {
+		bool_t			opened = false;	/* オープン済みフラグ */
+		struct termios	saved_term;		/* 元の端末制御情報 */
+		int_t			read_fd;		/* 読出し用ファイルディスクリプタ */
+		bool_t			rcv_flag;		/* 受信文字バッファ有効フラグ */
+		char			rcv_buf;		/* 受信文字バッファ */
+		bool_t			rcv_rdy;		/* 受信通知コールバック許可フラグ */
+		int_t			write_fd;		/* 書込み用ファイルディスクリプタ */
+		bool_t			snd_flag;		/* 送信文字バッファ有効フラグ */
+		char			snd_buf;		/* 送信文字バッファ */
+		bool_t			snd_rdy;		/* 送信通知コールバック許可フラグ */
+	};
+};
+
+/*
+ *  SIOドライバ（複合コンポーネント）のセルタイプ
+ */
+[active]
+composite tSIOPortNTShell {
+	/*
+	 *  シリアルインタフェースドライバとの結合
+	 */
+	entry				sSIOPort	eSIOPort;
+	[optional] call		siSIOCBR	ciSIOCBR;
+
+	/*
+	 *  属性の定義
+	 */
+	attr {
+		const char	*path = C_EXP("NULL");		/* パス名 */
+	};
+
+	/*
+	 *  SIOドライバの本体
+	 */
+	cell tSIOPortNTShellMain SIOPortMain {
+		path     = composite.path;
+		ciSIOCBR => composite.ciSIOCBR;
+	};
+	composite.eSIOPort => SIOPortMain.eSIOPort;
+
+	/*
+	 *  SIOドライバの終了処理ルーチン
+	 */
+	cell tTerminateRoutine TerminateSIO {
+		cTerminateRoutineBody = SIOPortMain.eTerminate;
+	};
+};
Index: asp3_tinet_ecnl_rx/trunk/ntshell/src/tSIOPortNTShellMain.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/ntshell/src/tSIOPortNTShellMain.c	(revision 387)
+++ asp3_tinet_ecnl_rx/trunk/ntshell/src/tSIOPortNTShellMain.c	(revision 387)
@@ -0,0 +1,255 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は，以下の(1)〜(4)の条件を満たす場合に限り，本ソフトウェ
+ *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+ *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+ *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+ *      スコード中に含まれていること．
+ *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+ *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+ *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+ *      の無保証規定を掲載すること．
+ *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+ *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+ *      と．
+ *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+ *        作権表示，この利用条件および下記の無保証規定を掲載すること．
+ *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+ *        報告すること．
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+ *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること．
+ * 
+ *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+ *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+ *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+ *  の責任を負わない．
+ * 
+ *  $Id$
+ */
+
+/*
+ *		シリアルインタフェースドライバのターゲット依存部（NTShell用）
+ */
+
+#include <t_stddef.h>
+#include <t_syslog.h>
+#include <errno.h> 
+#include <termios.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "tSIOPortNTShellMain_tecsgen.h"
+#include "syssvc/siofd.h"
+ 
+/*
+ *  SIOポートのオープン
+ */
+void
+eSIOPort_open(CELLIDX idx)
+{
+	CELLCB	*p_cellcb = GET_CELLCB(idx);
+	int_t	fd;
+	struct	termios term;
+
+	if (!VAR_opened) {
+		/*
+		 *  既にオープンしている場合は、二重にオープンしない．
+		 */
+		if (ATTR_path != NULL) {
+			fd = siofd_open(ATTR_path, O_RDWR, 0777);
+			assert(fd >= 0);
+			VAR_read_fd = fd;
+			VAR_write_fd = fd;
+		}
+		else {
+			fd = STDIN_FILENO;				/* 標準入出力を使う */
+			VAR_read_fd = STDIN_FILENO;
+			VAR_write_fd = STDOUT_FILENO;
+		}
+		siofd_fcntl(fd, F_SETOWN, getpid());
+		siofd_fcntl(fd, F_SETFL, (O_NONBLOCK | O_ASYNC));
+
+		siofd_tcgetattr(fd, &VAR_saved_term);
+		term = VAR_saved_term;
+		term.c_lflag &= ~(ECHO | ICANON);
+		siofd_tcsetattr(fd, TCSAFLUSH, &term);
+
+		VAR_rcv_flag = false;
+		VAR_rcv_rdy = false;
+		VAR_snd_flag = false;
+		VAR_snd_rdy = false;
+		VAR_opened = true;
+	}
+}
+
+/*
+ *  SIOポートのクローズ
+ */
+void
+eSIOPort_close(CELLIDX idx)
+{
+	CELLCB	*p_cellcb = GET_CELLCB(idx);
+	int_t	fd;
+
+	if (VAR_opened) {
+		fd = VAR_read_fd;
+		siofd_tcsetattr(fd, TCSAFLUSH, &VAR_saved_term);
+		siofd_fcntl(fd, F_SETFL, 0);
+
+		if (ATTR_path != NULL) {
+			siofd_close(VAR_read_fd);
+		}
+		VAR_opened = false;
+	}
+}
+
+/*
+ *  SIOポートへの文字送信
+ */
+bool_t
+eSIOPort_putChar(CELLIDX idx, char c)
+{
+	CELLCB	*p_cellcb = GET_CELLCB(idx);
+	int_t	n;
+
+	if (!VAR_snd_flag) {
+		if ((n = siofd_write(VAR_write_fd, &c, 1)) > 0) {
+			return(true);
+		}
+		else {
+			assert(n < 0 && errno == EAGAIN);
+			VAR_snd_flag = true;
+			VAR_snd_buf = c;
+			return(true);
+		}
+	}
+	else {
+		return(false);
+	}
+}
+
+/*
+ *  SIOポートからの文字受信
+ */
+int_t
+eSIOPort_getChar(CELLIDX idx)
+{
+	CELLCB	*p_cellcb = GET_CELLCB(idx);
+	char	c;
+	int_t	n;
+
+	if (VAR_rcv_flag) {
+		VAR_rcv_flag = false;
+		return((int_t)(uint8_t)(VAR_rcv_buf));
+	}
+	else if ((n = siofd_read(VAR_read_fd, &c, 1)) > 0) {
+		return((int_t)(uint8_t) c);
+	}
+	else {
+		assert(n < 0 && errno == EAGAIN);
+		return(-1);
+	}
+}
+
+/*
+ *  SIOポートからのコールバックの許可
+ */
+void
+eSIOPort_enableCBR(CELLIDX idx, uint_t cbrtn)
+{
+	CELLCB	*p_cellcb = GET_CELLCB(idx);
+
+	switch (cbrtn) {
+	case SIOSendReady:
+		VAR_snd_rdy = true;
+		break;
+	case SIOReceiveReady:
+		VAR_rcv_rdy = true;
+		break;
+	}
+}
+
+/*
+ *  SIOポートからのコールバックの禁止
+ */
+void
+eSIOPort_disableCBR(CELLIDX idx, uint_t cbrtn)
+{
+	CELLCB	*p_cellcb = GET_CELLCB(idx);
+
+	switch (cbrtn) {
+	case SIOSendReady:
+		VAR_snd_rdy = false;
+		break;
+	case SIOReceiveReady:
+		VAR_rcv_rdy = false;
+		break;
+	}
+}
+
+/*
+ *  SIOの割込みサービスルーチン
+ */
+bool_t
+sio_isr_snd(ID siopid)
+{
+	if (!(1 <= siopid && siopid <= tSIOPortNTShellMain_N_CELL))
+		return false;
+	CELLIDX idx = &tSIOPortNTShellMain_CB_tab[siopid - 1];
+	CELLCB	*p_cellcb = GET_CELLCB(idx);
+	int_t	n;
+
+	if (VAR_snd_flag) {
+		if ((n = siofd_write(VAR_write_fd, &(VAR_snd_buf), 1)) > 0) {
+			VAR_snd_flag = false;
+			if (VAR_snd_rdy) {
+				ciSIOCBR_readySend();
+				return VAR_snd_rdy;
+			}
+		}
+	}
+
+	return false;
+}
+
+/*
+ *  SIOの割込みサービスルーチン
+ */
+bool_t
+sio_isr_rcv(ID siopid, char c)
+{
+	if (!(1 <= siopid && siopid <= tSIOPortNTShellMain_N_CELL))
+		return false;
+	CELLIDX idx = &tSIOPortNTShellMain_CB_tab[siopid - 1];
+	CELLCB	*p_cellcb = GET_CELLCB(idx);
+
+	if (!VAR_rcv_flag) {
+		VAR_rcv_buf = c;
+		VAR_rcv_flag = true;
+		if (VAR_rcv_rdy) {
+			ciSIOCBR_readyReceive();
+			return VAR_rcv_rdy;
+		}
+	}
+
+	return false;
+}
+
+/*
+ *  SIOドライバの終了処理
+ */
+void
+eTerminate_main(CELLIDX idx)
+{
+	eSIOPort_close(idx);
+}
