Ignore:
Timestamp:
Apr 5, 2019, 9:26:53 PM (5 years ago)
Author:
coas-nagasima
Message:

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

Location:
asp3_tinet_ecnl_arm/trunk/ntshell/src
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/fdtable.c

    r364 r374  
    6868#include "kernel_cfg.h"
    6969#include <string.h>
    70 
    71 #define IO_TYPE_FREE    0
    72 #define IO_TYPE_SIO             1
    73 #define IO_TYPE_FILE    2
    74 #define IO_TYPE_DIR             3
    75 #define IO_TYPE_TCP             4
    76 #define IO_TYPE_UDP     5
    77 
    78 static struct _IO_FILE fd_table[8 * sizeof(FLGPTN)] = {
    79         { 0, IO_TYPE_SIO, 0, stdio_close, stdin_read, stdio_write, sio_seek, sio_ioctl },
    80         { 1, IO_TYPE_SIO, 0, stdio_close, stdio_read, stdout_write, sio_seek, sio_ioctl },
    81         { 2, IO_TYPE_SIO, 0, stdio_close, stdio_read, stderr_write, sio_seek, sio_ioctl },
     70#include "util/ntstdio.h"
     71#include "hal/serial_api.h"
     72
     73#ifdef _DEBUG
     74static const char THIS_FILE[] = __FILE__;
     75#endif
     76
     77static int stdio_close(struct SHELL_FILE *fp);
     78static size_t stdio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
     79static size_t stdio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
     80static size_t stdin_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
     81static size_t stdout_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
     82static size_t stderr_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
     83static void stdio_delete(struct SHELL_FILE *fp);
     84
     85static int sio_close(struct SHELL_FILE *fp);
     86static size_t sio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
     87static size_t sio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
     88static off_t sio_seek(struct SHELL_FILE *fp, off_t ofs, int org);
     89static int sio_ioctl(struct SHELL_FILE *fp, int req, void *arg);
     90static bool_t sio_readable(struct SHELL_FILE *fp);
     91static void sio_delete(struct SHELL_FILE *fp);
     92
     93IO_TYPE IO_TYPE_STDIN = { stdio_close, stdin_read, stdio_write, sio_seek, sio_ioctl, sio_readable, stdio_delete };
     94IO_TYPE IO_TYPE_STDOUT = { stdio_close, stdio_read, stdout_write, sio_seek, sio_ioctl, sio_readable, stdio_delete };
     95IO_TYPE IO_TYPE_STDERR = { stdio_close, stdio_read, stderr_write, sio_seek, sio_ioctl, sio_readable, stdio_delete };
     96IO_TYPE IO_TYPE_SIO = { sio_close, sio_read, sio_write, sio_seek, sio_ioctl, sio_readable, sio_delete };
     97ntstdio_t ntstdio;
     98
     99static struct SHELL_FILE fd_table[8 * sizeof(FLGPTN)] = {
     100        { 0, &IO_TYPE_STDIN, 0, .exinf = &ntstdio },
     101        { 1, &IO_TYPE_STDOUT, 0, .exinf = &ntstdio },
     102        { 2, &IO_TYPE_STDERR, 0,.exinf = &ntstdio },
    82103};
    83104#define fd_table_count (sizeof(fd_table) / sizeof(fd_table[0]))
    84105
    85 static int new_fd(int type, int id)
    86 {
     106extern ntstdio_t ntstdio;
     107extern serial_t stdio_uart;
     108
     109unsigned char ntstdio_xi(struct ntstdio_t *handle)
     110{
     111        return serial_getc((serial_t *)handle->exinf);
     112}
     113
     114void ntstdio_xo(struct ntstdio_t *handle, unsigned char c)
     115{
     116        serial_putc((serial_t *)handle->exinf, c);
     117}
     118
     119void sys_init(intptr_t exinf)
     120{
     121        ntstdio_init(&ntstdio, NTSTDIO_OPTION_LINE_ECHO | NTSTDIO_OPTION_CANON | NTSTDIO_OPTION_LF_CRLF | NTSTDIO_OPTION_LF_CR, ntstdio_xi, ntstdio_xo);
     122        ntstdio.exinf = (void *)&stdio_uart;
     123}
     124
     125int stdio_close(struct SHELL_FILE *fp)
     126{
     127        return -EPERM;
     128}
     129
     130size_t stdio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
     131{
     132        return -EPERM;
     133}
     134
     135size_t stdio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
     136{
     137        return -EPERM;
     138}
     139
     140size_t stdin_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
     141{
     142        int i = 0;
     143        while (i < len) {
     144                int c = ntstdio_getc((struct ntstdio_t *)fp->exinf);
     145                data[i++] = c;
     146                if ((c == EOF) || (c == '\n'))
     147                        break;
     148        }
     149        return i;
     150}
     151
     152size_t stdout_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
     153{
     154        for (int i = 0; i < len; i++) {
     155                ntstdio_putc((struct ntstdio_t *)fp->exinf, data[i]);
     156        }
     157        return len;
     158}
     159
     160size_t stderr_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
     161{
     162        for (int i = 0; i < len; i++) {
     163                ntstdio_putc((struct ntstdio_t *)fp->exinf, data[i]);
     164        }
     165        return len;
     166}
     167
     168void stdio_delete(struct SHELL_FILE *fp)
     169{
     170}
     171
     172int sio_close(struct SHELL_FILE *fp)
     173{
     174        return -EPERM;
     175}
     176
     177size_t sio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
     178{
     179        return -EPERM;
     180}
     181
     182size_t sio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
     183{
     184        return -EPERM;
     185}
     186
     187off_t sio_seek(struct SHELL_FILE *fp, off_t ofs, int org)
     188{
     189        return -EPERM;
     190}
     191
     192int sio_ioctl(struct SHELL_FILE *fp, int request, void *arg)
     193{
     194        switch (request) {
     195        case TIOCGWINSZ:
     196                return 0;
     197        case TCGETS:
     198                return sio_tcgetattr(fp->fd, (struct termios *)arg);
     199        case TCSETS + TCSANOW:
     200        case TCSETS + TCSADRAIN:
     201        case TCSETS + TCSAFLUSH:
     202                return sio_tcsetattr(fp->fd, request - TCSETS, (const struct termios *)arg);
     203        }
     204
     205        return -EINVAL;
     206}
     207
     208bool_t sio_readable(struct SHELL_FILE *fp)
     209{
     210        return fp->readevt_w != fp->readevt_r;
     211}
     212
     213void sio_delete(struct SHELL_FILE *fp)
     214{
     215        free((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf);
     216        ((struct ntstdio_t *)fp->exinf)->exinf = NULL;
     217        free((struct ntstdio_t *)fp->exinf);
     218        fp->exinf = NULL;
     219}
     220
     221struct SHELL_FILE *new_fp(IO_TYPE *type, int id, int writable)
     222{
     223        struct SHELL_FILE *fp = NULL;
     224        ER ret;
     225
     226        ret = wai_sem(SEM_FILEDESC);
     227        if (ret < 0) {
     228                syslog(LOG_ERROR, "wai_sem => %d", ret);
     229        }
     230
    87231        for (int fd = 3; fd < fd_table_count; fd++) {
    88                 struct _IO_FILE *fp = &fd_table[fd];
    89                 if (fp->type != IO_TYPE_FREE)
     232                fp = &fd_table[fd];
     233                if (fp->type != NULL)
    90234                        continue;
    91235
    92                 memset(fp, 0, sizeof(struct _IO_FILE));
     236                memset(fp, 0, sizeof(struct SHELL_FILE));
    93237                fp->fd = fd;
    94238                fp->type = type;
    95239                fp->handle = id;
    96                 return fd;
    97         }
    98 
    99         return -ENOMEM;
    100 }
    101 
    102 static struct _IO_FILE *id_to_fd(int type, int id)
    103 {
     240                fp->writable = writable;
     241                break;
     242        }
     243
     244        ret = sig_sem(SEM_FILEDESC);
     245        if (ret < 0) {
     246                syslog(LOG_ERROR, "sig_sem => %d", ret);
     247        }
     248
     249        return fp;
     250}
     251
     252struct SHELL_FILE *id_to_fd(IO_TYPE *type, int id)
     253{
     254        struct SHELL_FILE *fp = NULL;
     255        ER ret;
     256
     257        ret = wai_sem(SEM_FILEDESC);
     258        if (ret < 0) {
     259                syslog(LOG_ERROR, "wai_sem => %d", ret);
     260        }
     261
    104262        for (int fd = 3; fd < fd_table_count; fd++) {
    105                 struct _IO_FILE *fp = &fd_table[fd];
     263                fp = &fd_table[fd];
    106264                if ((fp->type == type) && (fp->handle == id))
    107                         return fp;
    108         }
    109 
    110         return NULL;
    111 }
    112 
    113 static int delete_fd(int type, int id)
    114 {
    115         struct _IO_FILE *fp = id_to_fd(type, id);
     265                        break;
     266        }
     267
     268        ret = sig_sem(SEM_FILEDESC);
     269        if (ret < 0) {
     270                syslog(LOG_ERROR, "sig_sem => %d", ret);
     271        }
     272
     273        return fp;
     274}
     275
     276int delete_fd_by_id(IO_TYPE *type, int id)
     277{
     278        struct SHELL_FILE *fp = id_to_fd(type, id);
    116279        if (fp == NULL)
    117280                return -EBADF;
     
    120283}
    121284
    122 int delete_fp(struct _IO_FILE *fp)
    123 {
    124         free(fp->pfile);
    125         fp->pfile = NULL;
    126         free(fp->pdir);
    127         fp->pdir = NULL;
    128         free(fp->psock);
    129         fp->psock = NULL;
    130         memset(fp, 0, sizeof(struct _IO_FILE));
     285int delete_fp(struct SHELL_FILE *fp)
     286{
     287        ER ret;
     288
     289        fp->type->delete(fp);
     290
     291        ret = wai_sem(SEM_FILEDESC);
     292        if (ret < 0) {
     293                syslog(LOG_ERROR, "wai_sem => %d", ret);
     294        }
     295
     296        memset(fp, 0, sizeof(struct SHELL_FILE));
     297
     298        ret = sig_sem(SEM_FILEDESC);
     299        if (ret < 0) {
     300                syslog(LOG_ERROR, "sig_sem => %d", ret);
     301        }
    131302
    132303        return 0;
    133304}
    134305
    135 struct _IO_FILE *fd_to_fp(int fd)
     306struct SHELL_FILE *fd_to_fp(int fd)
    136307{
    137308        if ((fd < 0) || (fd >= fd_table_count))
     
    140311}
    141312
    142 struct _IO_FILE *new_sio_fd(int sioid)
    143 {
    144         int fd = new_fd(IO_TYPE_SIO, sioid);
    145         if ((fd < 0) || (fd >= fd_table_count))
    146                 return NULL;
    147 
    148         struct _IO_FILE *fp = &fd_table[fd];
    149         fp->close = sio_close;
    150         fp->read = sio_read;
    151         fp->write = sio_write;
    152         fp->seek = sio_seek;
    153         fp->ioctl = sio_ioctl;
    154         fp->writable = 1;
    155 
    156         return fp;
    157 }
    158 
    159 int delete_sio_fd(int sioid)
    160 {
    161         return delete_fd(IO_TYPE_SIO, sioid);
    162 }
    163 
    164 struct _IO_FILE *sioid_to_fd(int sioid)
    165 {
    166         return id_to_fd(IO_TYPE_SIO, sioid);
    167 }
    168 
    169 struct _IO_FILE *new_file_fd(int fileid)
    170 {
    171         int fd = new_fd(IO_TYPE_FILE, fileid);
    172         if ((fd < 0) || (fd >= fd_table_count))
    173                 return NULL;
    174 
    175         struct _IO_FILE *fp = &fd_table[fd];
    176         fp->close = file_close;
    177         fp->read = file_read;
    178         fp->write = file_write;
    179         fp->seek = file_seek;
    180         fp->ioctl = file_ioctl;
    181         fp->writable = 1;
    182         fp->pfile = malloc(sizeof(FIL));
    183         memset(fp->pfile, 0, sizeof(FIL));
    184 
    185         return fp;
    186 }
    187 
    188 int delete_file_fd(int fileid)
    189 {
    190         return delete_fd(IO_TYPE_FILE, fileid);
    191 }
    192 
    193 struct _IO_FILE *fileid_to_fd(int fileid)
    194 {
    195         return id_to_fd(IO_TYPE_FILE, fileid);
    196 }
    197 
    198 struct _IO_FILE *new_dir_fd(int fileid)
    199 {
    200         int fd = new_fd(IO_TYPE_DIR, fileid);
    201         if ((fd < 0) || (fd >= fd_table_count))
    202                 return NULL;
    203 
    204         struct _IO_FILE *fp = &fd_table[fd];
    205         fp->close = dir_close;
    206         fp->read = dir_read;
    207         fp->write = dir_write;
    208         fp->seek = dir_seek;
    209         fp->ioctl = dir_ioctl;
    210         fp->writable = 0;
    211         fp->pdir = malloc(sizeof(struct _IO_DIR));
    212         memset(fp->pdir, 0, sizeof(struct _IO_DIR));
    213 
    214         return fp;
    215 }
    216 
    217 int delete_dir_fd(int dirid)
    218 {
    219         return delete_fd(IO_TYPE_DIR, dirid);
    220 }
    221 
    222 struct _IO_FILE *dirid_to_fd(int dirid)
    223 {
    224         return id_to_fd(IO_TYPE_DIR, dirid);
    225 }
    226 
    227 #ifndef NTSHELL_NO_SOCKET
    228 struct _IO_FILE *new_tcp_fd(int tcpid)
    229 {
    230         int fd = new_fd(IO_TYPE_TCP, tcpid);
    231         if ((fd < 0) || (fd >= fd_table_count))
    232                 return NULL;
    233 
    234         struct _IO_FILE *fp = &fd_table[fd];
    235         fp->close = tcp_fd_close;
    236         fp->read = tcp_fd_read;
    237         fp->write = tcp_fd_write;
    238         fp->seek = tcp_fd_seek;
    239         fp->ioctl = tcp_fd_ioctl;
    240         fp->writable = 0;
    241         fp->psock = malloc(sizeof(socket_t));
    242         memset(fp->psock, 0, sizeof(socket_t));
    243 
    244         return fp;
    245 }
    246 
    247 int delete_tcp_fd(int tcpid)
    248 {
    249         return delete_fd(IO_TYPE_TCP, tcpid);
    250 }
    251 
    252 struct _IO_FILE *tcpid_to_fd(int tcpid)
    253 {
    254         return id_to_fd(IO_TYPE_TCP, tcpid);
    255 }
    256 
    257 struct _IO_FILE *new_udp_fd(int udpid)
    258 {
    259         int fd = new_fd(IO_TYPE_UDP, udpid);
    260         if ((fd < 0) || (fd >= fd_table_count))
    261                 return NULL;
    262 
    263         struct _IO_FILE *fp = &fd_table[fd];
    264         fp->close = udp_fd_close;
    265         fp->read = udp_fd_read;
    266         fp->write = udp_fd_write;
    267         fp->seek = udp_fd_seek;
    268         fp->ioctl = udp_fd_ioctl;
    269         fp->writable = 1;
    270         fp->psock = malloc(sizeof(socket_t));
    271         memset(fp->psock, 0, sizeof(socket_t));
    272 
    273         return fp;
    274 }
    275 
    276 int delete_udp_fd(int udpid)
    277 {
    278         return delete_fd(IO_TYPE_UDP, udpid);
    279 }
    280 
    281 struct _IO_FILE *udpid_to_fd(int udpid)
    282 {
    283         return id_to_fd(IO_TYPE_UDP, udpid);
    284 }
    285 
    286 #endif
    287 
    288 void memor(void *dst, void *src, size_t len)
     313void memand(void *dst, void *src, size_t len)
    289314{
    290315        uint8_t *d = (uint8_t *)dst;
     
    293318
    294319        while (s < e) {
    295                 *d++ |= *s++;
     320                *d++ &= *s++;
    296321        }
    297322}
     
    336361
    337362        ret = shell_get_evts(&evts, tmout);
    338         if (rfds != NULL)
    339                 memset(rfds, 0, sizeof(fd_set));
    340         if (wfds != NULL)
    341                 memset(wfds, 0, sizeof(fd_set));
    342         if (efds != NULL)
    343                 memset(efds, 0, sizeof(fd_set));
    344363        if (ret == E_OK) {
    345364                if (rfds != NULL)
    346                         memor(rfds, &evts.readfds, sizeof(fd_set));
     365                        memand(rfds, &evts.readfds, sizeof(fd_set));
    347366                if (wfds != NULL)
    348                         memor(wfds, &evts.writefds, sizeof(fd_set));
     367                        memand(wfds, &evts.writefds, sizeof(fd_set));
    349368                if (efds != NULL)
    350                         memor(efds, &evts.errorfds, sizeof(fd_set));
     369                        memand(efds, &evts.errorfds, sizeof(fd_set));
    351370                return evts.count;
    352371        }
    353372        if (ret == E_TMOUT) {
     373                if (rfds != NULL)
     374                        memset(rfds, 0, sizeof(fd_set));
     375                if (wfds != NULL)
     376                        memset(wfds, 0, sizeof(fd_set));
     377                if (efds != NULL)
     378                        memset(efds, 0, sizeof(fd_set));
    354379                return 0;
    355380        }
     
    419444{
    420445        int fd = STDIN_FILENO;
    421         struct _IO_FILE *fp = &fd_table[fd];
    422         T_SERIAL_RPOR rpor;
     446        struct SHELL_FILE *fp = &fd_table[fd];
    423447        FLGPTN flgptn = 0;
    424448
    425         ER ret = serial_ref_por(SIO_PORTID, &rpor);
    426         if (ret != E_OK)
    427                 return;
    428 
    429         if (rpor.reacnt != 0) {
     449        if (serial_readable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) {
    430450                if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
    431451
    432452                FD_SET(fd, (fd_set *)&flgptn);
    433453        }
    434         if (rpor.wricnt != 0) {
     454        if (serial_writable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) {
    435455                if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
    436456
     
    447467{
    448468        int fd = STDIN_FILENO;
    449         struct _IO_FILE *fp = &fd_table[fd];
    450         T_SERIAL_RPOR rpor;
     469        struct SHELL_FILE *fp = &fd_table[fd];
    451470        *flgptn = 0;
    452471
    453         ER ret = serial_ref_por(SIO_PORTID, &rpor);
    454         if (ret != E_OK)
    455                 return;
    456 
    457         if (rpor.reacnt != 0) {
     472        if (serial_readable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) {
    458473                if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
    459474
    460475                FD_SET(fd, (fd_set *)flgptn);
    461476        }
    462         if (rpor.wricnt != 0) {
     477        if (serial_writable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) {
    463478                if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
    464479
     
    466481        }
    467482}
    468 
    469 #ifndef NTSHELL_NO_SOCKET
    470 
    471 ER socket_tcp_callback(ID cepid, FN fncd, void *p_parblk)
    472 {
    473         struct _IO_FILE *fp = tcpid_to_fd(cepid);
    474         FLGPTN flgptn = 0;
    475         ER ret;
    476         int len;
    477 
    478         if (fp == NULL)
    479                 return E_PAR;
    480 
    481         int fd = fp->fd;
    482         FD_SET(fd, (fd_set *)&flgptn);
    483 
    484         switch (fncd) {
    485         case TFN_TCP_RCV_BUF:
    486                 len = *(int *)p_parblk;
    487                 if (len <= 0)
    488                         return E_OK;
    489 
    490                 ret = wai_sem(SEM_FILEDESC);
    491                 if (ret < 0) {
    492                         syslog(LOG_ERROR, "wai_sem => %d", ret);
    493                 }
    494                 fp->psock->len += len;
    495                 ret = sig_sem(SEM_FILEDESC);
    496                 if (ret < 0) {
    497                         syslog(LOG_ERROR, "sig_sem => %d", ret);
    498                 }
    499 
    500                 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
    501 
    502                 set_flg(FLG_SELECT_WAIT, flgptn);
    503                 return E_OK;
    504 
    505         case TFN_TCP_RCV_DAT:
    506                 len = *(int *)p_parblk;
    507                 if (len <= 0)
    508                         return E_OK;
    509 
    510                 ret = wai_sem(SEM_FILEDESC);
    511                 if (ret < 0) {
    512                         syslog(LOG_ERROR, "wai_sem => %d", ret);
    513                 }
    514                 fp->psock->len += len;
    515                 ret = sig_sem(SEM_FILEDESC);
    516                 if (ret < 0) {
    517                         syslog(LOG_ERROR, "sig_sem => %d", ret);
    518                 }
    519 
    520                 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
    521 
    522                 set_flg(FLG_SELECT_WAIT, flgptn);
    523                 return E_OK;
    524 
    525         case TFN_TCP_SND_DAT:
    526                 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
    527 
    528                 set_flg(FLG_SELECT_WAIT, flgptn);
    529                 return E_OK;
    530 
    531         case TFN_TCP_CAN_CEP:
    532                 if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++;
    533 
    534                 set_flg(FLG_SELECT_WAIT, flgptn);
    535                 return E_OK;
    536 
    537         case TFN_TCP_DEL_REP:
    538                 delete_tcp_rep(cepid);
    539                 return E_OK;
    540 
    541         case TFN_TCP_DEL_CEP:
    542                 delete_tcp_fd(cepid);
    543                 return E_OK;
    544 
    545         default:
    546                 return E_OK;
    547         }
    548 }
    549 
    550 ER socket_udp_callback(ID cepid, FN fncd, void *p_parblk)
    551 {
    552         struct _IO_FILE *fp = udpid_to_fd(cepid);
    553         FLGPTN flgptn = 0;
    554         int len;
    555 
    556         if (fp == NULL)
    557                 return E_PAR;
    558 
    559         int fd = fp->fd;
    560         FD_SET(fd, (fd_set *)&flgptn);
    561 
    562         switch (fncd) {
    563         case TEV_UDP_RCV_DAT:
    564         {
    565                 T_UDP_RCV_DAT_PARA *udppara = (T_UDP_RCV_DAT_PARA *)p_parblk;
    566                 len = udppara->len;
    567                 if (len <= 0)
    568                         return E_OK;
    569 
    570                 ER ret = wai_sem(SEM_FILEDESC);
    571                 if (ret < 0) {
    572                         syslog(LOG_ERROR, "wai_sem => %d", ret);
    573                 }
    574                 fp->psock->len = len;
    575                 if (fp->psock->input != NULL) {
    576                         ret = rel_net_buf(fp->psock->input);
    577                         if (ret < 0) {
    578                                 syslog(LOG_ERROR, "rel_net_buf => %d", ret);
    579                         }
    580                 }
    581                 fp->psock->input = udppara->input;
    582                 fp->psock->buf = GET_UDP_SDU(udppara->input, udppara->off);
    583                 memset(&fp->psock->raddr4, 0, sizeof(fp->psock->raddr4));
    584                 fp->psock->raddr4.sin_family = AF_INET;
    585                 fp->psock->raddr4.sin_port = htons(udppara->rep4.portno);
    586                 fp->psock->raddr4.sin_addr.s_addr = htonl(udppara->rep4.ipaddr);
    587                 udppara->input->flags |= NB_FLG_NOREL_IFOUT;
    588                 ret = sig_sem(SEM_FILEDESC);
    589                 if (ret < 0) {
    590                         syslog(LOG_ERROR, "sig_sem => %d", ret);
    591                 }
    592 
    593                 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
    594 
    595                 set_flg(FLG_SELECT_WAIT, flgptn);
    596                 return E_OK;
    597         }
    598         case TFN_UDP_CRE_CEP:
    599                 return E_OK;
    600 
    601         case TFN_UDP_RCV_DAT:
    602                 len = *(int *)p_parblk;
    603                 if (len <= 0)
    604                         return E_OK;
    605 
    606                 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
    607 
    608                 set_flg(FLG_SELECT_WAIT, flgptn);
    609                 return E_OK;
    610 
    611         case TFN_UDP_SND_DAT:
    612                 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
    613 
    614                 set_flg(FLG_SELECT_WAIT, flgptn);
    615                 return E_OK;
    616 
    617         case TFN_UDP_CAN_CEP:
    618                 if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++;
    619 
    620                 set_flg(FLG_SELECT_WAIT, flgptn);
    621                 return E_OK;
    622 
    623         case TFN_UDP_DEL_CEP:
    624                 delete_udp_fd(cepid);
    625                 return E_OK;
    626 
    627         default:
    628                 return E_OK;
    629         }
    630 }
    631 
    632 #endif
    633483
    634484ER shell_get_evts(struct fd_events *evts, TMO tmout)
     
    642492                ER ret;
    643493                FLGPTN waitptn, flgptn, readfds = 0, writefds = 0;
    644                 struct _IO_FILE *fp = NULL;
     494                struct SHELL_FILE *fp = NULL;
    645495
    646496                stdio_update_evts();
     
    656506#ifndef NTSHELL_NO_SOCKET
    657507                        if (FD_ISSET(fd, &evts->readfds)) {
    658                                 if ((fp->type == IO_TYPE_TCP) && (fp->psock->cepid != 0)) {
    659                                         if (fp->psock->len == 0) {
    660                                                 ret = tcp_rcv_buf(fp->psock->cepid, &fp->psock->input, TMO_NBLK);
    661                                                 if ((ret != E_WBLK) && (ret != E_OBJ) && (ret < 0)) {
    662                                                         syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret);
    663                                                         //return ret;
    664                                                 }
    665                                                 if (ret > 0) {
    666                                                         ret = wai_sem(SEM_FILEDESC);
    667                                                         if (ret < 0) {
    668                                                                 syslog(LOG_ERROR, "wai_sem => %d", ret);
    669                                                         }
    670                                                         fp->psock->len += ret;
    671                                                         ret = sig_sem(SEM_FILEDESC);
    672                                                         if (ret < 0) {
    673                                                                 syslog(LOG_ERROR, "sig_sem => %d", ret);
    674                                                         }
    675                                                 }
    676                                         }
    677                                         else ret = 1;
    678                                         if (ret > 0) {
    679                                                 FD_SET(fd, (fd_set *)&readfds);
    680                                                 count++;
    681                                                 if (fp->readevt_w == fp->readevt_r) fp->readevt_r--;
    682                                         }
    683                                 }
    684                                 else if ((fp->type == IO_TYPE_UDP) && (fp->psock->cepid != 0)) {
    685                                         if (fp->psock->input != NULL) {
    686                                                 FD_SET(fd, (fd_set *)&readfds);
    687                                                 count++;
    688                                                 if (fp->readevt_w == fp->readevt_r) fp->readevt_r--;
    689                                         }
     508                                if (fp->type->readable(fp)) {
     509                                        FD_SET(fd, (fd_set *)&readfds);
     510                                        count++;
     511                                        if (fp->readevt_w == fp->readevt_r) fp->readevt_r--;
    690512                                }
    691513                                else {
     
    786608void clean_fd()
    787609{
    788         struct _IO_FILE *fp = NULL;
     610        struct SHELL_FILE *fp = NULL;
    789611        for (int fd = 3; fd < fd_table_count; fd++) {
    790612                fp = &fd_table[fd];
     
    792614                        continue;
    793615
    794                 fp->close(fp);
     616                fp->type->close(fp);
    795617
    796618                delete_fp(fp);
     
    800622int shell_ioctl(int fd, int request, void *arg)
    801623{
    802         struct _IO_FILE *fp = fd_to_fp(fd);
     624        struct SHELL_FILE *fp = fd_to_fp(fd);
    803625        if (fp == NULL)
    804626                return -EBADF;
    805627
    806         return fp->ioctl(fp, request, arg);
     628        return fp->type->ioctl(fp, request, arg);
    807629}
    808630
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/io_stub.c

    r352 r374  
    11/*
    22 *  TOPPERS ECHONET Lite Communication Middleware
    3  * 
     3 *
    44 *  Copyright (C) 2017 Cores Co., Ltd. Japan
    5  * 
     5 *
    66 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    77 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     
    2626 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
    2727 *      免責すること.
    28  * 
     28 *
    2929 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
    3030 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     
    3232 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    3333 *  の責任を負わない.
    34  * 
     34 *
    3535 *  @(#) $Id$
    3636 */
     
    4343#include <sil.h>
    4444#include <string.h>
     45#include "syssvc/serial.h"
    4546#include "syssvc/syslog.h"
    4647#include "socket_stub.h"
     
    4950#include "core/ntlibc.h"
    5051#include "kernel_cfg.h"
     52#include "target_syssvc.h"
    5153
    5254int fresult2errno(FRESULT res)
     
    7779}
    7880
    79 int shell_open(const char * path, int flags, void *arg)
    80 {
    81         FRESULT res;
    82         struct _IO_FILE *fp;
     81static int file_close(struct SHELL_FILE *fp);
     82static size_t file_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
     83static size_t file_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
     84static off_t file_seek(struct SHELL_FILE *fp, off_t ofs, int org);
     85static int file_ioctl(struct SHELL_FILE *fp, int req, void *arg);
     86static bool_t file_readable(struct SHELL_FILE *fp);
     87static void file_delete(struct SHELL_FILE *fp);
     88
     89static int dir_close(struct SHELL_FILE *fp);
     90static size_t dir_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
     91static size_t dir_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
     92static off_t dir_seek(struct SHELL_FILE *fp, off_t ofs, int org);
     93static int dir_ioctl(struct SHELL_FILE *fp, int req, void *arg);
     94static bool_t dir_readable(struct SHELL_FILE *fp);
     95static void dir_delete(struct SHELL_FILE *fp);
     96
     97IO_TYPE IO_TYPE_FILE = { file_close, file_read, file_write, file_seek, file_ioctl, file_readable, file_delete };
     98IO_TYPE IO_TYPE_DIR = { dir_close, dir_read, dir_write, dir_seek, dir_ioctl, dir_readable, dir_delete };
     99
     100int shell_open(const char *path, int flags, void *arg)
     101{
     102        FRESULT res;
     103        struct SHELL_FILE *fp;
    83104
    84105        if (flags & O_DIRECTORY) {
    85                 fp = new_dir_fd(0);
     106                fp = new_fp(&IO_TYPE_DIR, 0, 0);
    86107                if (fp == NULL)
    87108                        return -ENOMEM;
    88109
    89                 DIR *dir = &fp->pdir->dir;
     110                fp->exinf = malloc(sizeof(struct SHELL_DIR));
     111                memset(fp->exinf, 0, sizeof(struct SHELL_DIR));
     112
     113                FATFS_DIR *dir = &((struct SHELL_DIR *)fp->exinf)->dir;
    90114                FRESULT res;
    91115                if ((res = f_opendir(dir, path)) != FR_OK) {
     
    95119        }
    96120
    97         fp = new_file_fd(0);
     121        fp = new_fp(&IO_TYPE_FILE, 0, 1);
    98122        if (fp == NULL)
    99123                return -ENOMEM;
     124
     125        fp->exinf = malloc(sizeof(FIL));
     126        memset(fp->exinf, 0, sizeof(FIL));
    100127
    101128        BYTE fmd = 0;
     
    133160        }
    134161
    135         if ((res = f_open(fp->pfile, path, fmd)) == FR_OK) {
     162        if ((res = f_open((FIL *)fp->exinf, path, fmd)) == FR_OK) {
    136163                fp->handle = fp->fd;
    137164                return fp->fd;
     
    141168}
    142169
    143 int file_close(struct _IO_FILE *fp)
    144 {
    145         FRESULT res;
    146 
    147         if ((res = f_close(fp->pfile)) == FR_OK) {
     170int file_close(struct SHELL_FILE *fp)
     171{
     172        FRESULT res;
     173
     174        if ((res = f_close((FIL *)fp->exinf)) == FR_OK) {
    148175                return 0;
    149176        }
     
    152179}
    153180
    154 size_t file_read(struct _IO_FILE *fp, unsigned char *data, size_t len)
     181size_t file_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
    155182{
    156183        unsigned int ret = 0;
    157184        FRESULT res;
    158185
    159         if ((res = f_read(fp->pfile, data, len, &ret)) != FR_OK)
     186        if ((res = f_read((FIL *)fp->exinf, data, len, &ret)) != FR_OK)
    160187                return -EIO;
    161188
     
    163190}
    164191
    165 size_t file_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
     192size_t file_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
    166193{
    167194        unsigned int ret = 0;
    168195        FRESULT res;
    169196
    170         if ((res = f_write(fp->pfile, data, len, &ret)) != FR_OK)
     197        if ((res = f_write((FIL *)fp->exinf, data, len, &ret)) != FR_OK)
    171198                return -EIO;
    172199
     
    174201}
    175202
    176 off_t file_seek(struct _IO_FILE *fp, off_t ptr, int dir)
     203off_t file_seek(struct SHELL_FILE *fp, off_t ptr, int dir)
    177204{
    178205        switch (dir) {
     
    191218
    192219        FRESULT res;
    193         if ((res = f_seek(fp->pfile, ptr, dir)) != FR_OK)
     220        if ((res = f_seek((FIL *)fp->exinf, ptr, dir)) != FR_OK)
    194221                return -EIO;
    195222
    196         return fp->pfile->fptr;
    197 }
    198 
    199 int file_ioctl(struct _IO_FILE *fp, int req, void *arg)
     223        return ((FIL *)fp->exinf)->fptr;
     224}
     225
     226int file_ioctl(struct SHELL_FILE *fp, int req, void *arg)
    200227{
    201228        DRESULT res;
    202229
    203         if ((res = disk_ioctl(fp->pfile->fs->drv, req, arg) != RES_OK))
     230        if ((res = disk_ioctl(((FIL *)fp->exinf)->fs->drv, req, arg) != RES_OK))
    204231                return -EINVAL;
    205232
     
    207234}
    208235
     236bool_t file_readable(struct SHELL_FILE *fp)
     237{
     238        return fp->readevt_w != fp->readevt_r;
     239}
     240
     241void file_delete(struct SHELL_FILE *fp)
     242{
     243        free((FIL *)fp->exinf);
     244        fp->exinf = NULL;
     245}
     246
    209247int shell_close(int fd)
    210248{
    211         struct _IO_FILE *fp = fd_to_fp(fd);
    212         if (fp == NULL)
    213                 return -EBADF;
    214 
    215         int ret = fp->close(fp);
     249        struct SHELL_FILE *fp = fd_to_fp(fd);
     250        if (fp == NULL)
     251                return -EBADF;
     252
     253        int ret = fp->type->close(fp);
    216254
    217255        delete_fp(fp);
     
    222260ssize_t shell_read(int fd, void *data, size_t len)
    223261{
    224         struct _IO_FILE *fp = fd_to_fp(fd);
    225         if (fp == NULL)
    226                 return -EBADF;
    227 
    228         return fp->read(fp, (unsigned char *)data, len);
     262        struct SHELL_FILE *fp = fd_to_fp(fd);
     263        if (fp == NULL)
     264                return -EBADF;
     265
     266        return fp->type->read(fp, (unsigned char *)data, len);
    229267}
    230268
     
    232270{
    233271        int result = 0;
    234         struct _IO_FILE *fp = fd_to_fp(fd);
     272        struct SHELL_FILE *fp = fd_to_fp(fd);
    235273        if (fp == NULL)
    236274                return -EBADF;
     
    238276        const struct iovec *end = &iov[iovcnt];
    239277        for (; iov < end; iov++) {
    240                 result += fp->read(fp, (unsigned char *)iov->iov_base, iov->iov_len);
     278                result += fp->type->read(fp, (unsigned char *)iov->iov_base, iov->iov_len);
    241279        }
    242280
     
    246284ssize_t shell_write(int fd, const void *data, size_t len)
    247285{
    248         struct _IO_FILE *fp = fd_to_fp(fd);
    249         if (fp == NULL)
    250                 return -EBADF;
    251 
    252         return fp->write(fp, (unsigned char *)data, len);
     286        struct SHELL_FILE *fp = fd_to_fp(fd);
     287        if (fp == NULL)
     288                return -EBADF;
     289
     290        return fp->type->write(fp, (unsigned char *)data, len);
    253291}
    254292
     
    256294{
    257295        int result = 0;
    258         struct _IO_FILE *fp = fd_to_fp(fd);
     296        struct SHELL_FILE *fp = fd_to_fp(fd);
    259297        if (fp == NULL)
    260298                return -EBADF;
     
    262300        const struct iovec *end = &iov[iovcnt];
    263301        for (; iov < end; iov++) {
    264                 result += fp->write(fp, (unsigned char *)iov->iov_base, iov->iov_len);
     302                result += fp->type->write(fp, (unsigned char *)iov->iov_base, iov->iov_len);
    265303        }
    266304
     
    270308int shell_llseek(int fd, off_t ptr, off_t *result, int dir)
    271309{
    272         struct _IO_FILE *fp = fd_to_fp(fd);
    273         if (fp == NULL)
    274                 return -EBADF;
    275 
    276         off_t ret = fp->seek(fp, ptr, dir);
     310        struct SHELL_FILE *fp = fd_to_fp(fd);
     311        if (fp == NULL)
     312                return -EBADF;
     313
     314        off_t ret = fp->type->seek(fp, ptr, dir);
    277315        if (ret < 0)
    278316                return ret;
     
    284322int shell_fstat(int fd, struct stat * st)
    285323{
    286         struct _IO_FILE *fp = fd_to_fp(fd);
     324        struct SHELL_FILE *fp = fd_to_fp(fd);
    287325        if (fp == NULL)
    288326                return -EBADF;
     
    296334int shell_fsync(int fd)
    297335{
    298         struct _IO_FILE *fp = fd_to_fp(fd);
     336        struct SHELL_FILE *fp = fd_to_fp(fd);
    299337        if (fp == NULL)
    300338                return -EBADF;
     
    304342int shell_ftruncate(int fd, off_t length)
    305343{
    306         struct _IO_FILE *fp = fd_to_fp(fd);
    307         if (fp == NULL)
    308                 return -EBADF;
    309 
    310         FRESULT res;
    311         if ((res = f_truncate(fp->pfile)) != FR_OK)
     344        struct SHELL_FILE *fp = fd_to_fp(fd);
     345        if (fp == NULL)
     346                return -EBADF;
     347
     348        FRESULT res;
     349        if ((res = f_truncate((FIL *)fp->exinf)) != FR_OK)
    312350                return fresult2errno(res);
    313351
     
    320358}
    321359
     360extern IO_TYPE IO_TYPE_SIO;
     361
    322362int sio_tcgetattr(int fd, struct termios *termios)
    323363{
    324         extern ntstdio_t ntstdio;
    325 
    326         if (fd == STDIN_FILENO) {
    327                 memset(termios, 0, sizeof(*termios));
    328 
    329                 if (ntstdio.option & NTSTDIO_OPTION_LINE_ECHO) {
    330                         termios->c_lflag |= ECHO;
     364        struct SHELL_FILE *fp = fd_to_fp(fd);
     365        if ((fp == NULL) || (fp->type != &IO_TYPE_SIO))
     366                return -EBADF;
     367
     368        ntstdio_t *ntstdio = (ntstdio_t *)fp->exinf;
     369
     370        memset(termios, 0, sizeof(*termios));
     371
     372        if (ntstdio->option & NTSTDIO_OPTION_LINE_ECHO) {
     373                termios->c_lflag |= ECHO;
     374        }
     375        else {
     376                termios->c_lflag &= ~ECHO;
     377        }
     378        if (ntstdio->option & NTSTDIO_OPTION_CANON) {
     379                termios->c_lflag |= ICANON;
     380        }
     381        else {
     382                termios->c_lflag &= ~ICANON;
     383        }
     384        if (ntstdio->option & NTSTDIO_OPTION_LF_CR) {
     385                termios->c_iflag |= INLCR;
     386        }
     387        else {
     388                termios->c_iflag &= ~INLCR;
     389        }
     390        if (ntstdio->option & NTSTDIO_OPTION_LF_CRLF) {
     391                termios->c_oflag |= ONLCR;
     392        }
     393        else {
     394                termios->c_oflag &= ~ONLCR;
     395        }
     396
     397        return 0;
     398}
     399
     400int sio_tcsetattr(int fd, int optional_actions, const struct termios *termios)
     401{
     402        struct SHELL_FILE *fp = fd_to_fp(fd);
     403        if ((fp == NULL) || (fp->type != &IO_TYPE_SIO))
     404                return -EBADF;
     405
     406        ntstdio_t *ntstdio = (ntstdio_t *)fp->exinf;
     407
     408        if (optional_actions == TCSANOW) {
     409                if (termios->c_lflag & ECHO) {
     410                        ntstdio->option |= NTSTDIO_OPTION_LINE_ECHO;
    331411                }
    332412                else {
    333                         termios->c_lflag &= ~ECHO;
    334                 }
    335                 if (ntstdio.option & NTSTDIO_OPTION_CANON) {
    336                         termios->c_lflag |= ICANON;
     413                        ntstdio->option &= ~NTSTDIO_OPTION_LINE_ECHO;
     414                }
     415                if (termios->c_lflag & ICANON) {
     416                        ntstdio->option |= NTSTDIO_OPTION_CANON;
    337417                }
    338418                else {
    339                         termios->c_lflag &= ~ICANON;
    340                 }
    341                 if (ntstdio.option & NTSTDIO_OPTION_LF_CR) {
    342                         termios->c_iflag |= INLCR;
     419                        ntstdio->option &= ~NTSTDIO_OPTION_CANON;
     420                }
     421                if (termios->c_iflag & INLCR) {
     422                        ntstdio->option |= NTSTDIO_OPTION_LF_CR;
    343423                }
    344424                else {
    345                         termios->c_iflag &= ~INLCR;
    346                 }
    347                 if (ntstdio.option & NTSTDIO_OPTION_LF_CRLF) {
    348                         termios->c_oflag |= ONLCR;
     425                        ntstdio->option &= ~NTSTDIO_OPTION_LF_CR;
     426                }
     427                if (termios->c_oflag & ONLCR) {
     428                        ntstdio->option |= NTSTDIO_OPTION_LF_CRLF;
    349429                }
    350430                else {
    351                         termios->c_oflag &= ~ONLCR;
     431                        ntstdio->option &= ~NTSTDIO_OPTION_LF_CRLF;
    352432                }
    353433                return 0;
    354434        }
    355         shell_abort();
    356         return 0;
    357 }
    358 
    359 int sio_tcsetattr(int fd, int optional_actions, const struct termios *termios)
    360 {
    361         extern ntstdio_t ntstdio;
    362 
    363         if ((fd == STDIN_FILENO) && (optional_actions == TCSANOW)) {
    364                 if (termios->c_lflag & ECHO) {
    365                         ntstdio.option |= NTSTDIO_OPTION_LINE_ECHO;
    366                 }
    367                 else {
    368                         ntstdio.option &= ~NTSTDIO_OPTION_LINE_ECHO;
    369                 }
    370                 if (termios->c_lflag & ICANON) {
    371                         ntstdio.option |= NTSTDIO_OPTION_CANON;
    372                 }
    373                 else {
    374                         ntstdio.option &= ~NTSTDIO_OPTION_CANON;
    375                 }
    376                 if (termios->c_iflag & INLCR) {
    377                         ntstdio.option |= NTSTDIO_OPTION_LF_CR;
    378                 }
    379                 else{
    380                         ntstdio.option &= ~NTSTDIO_OPTION_LF_CR;
    381                 }
    382                 if (termios->c_oflag & ONLCR) {
    383                         ntstdio.option |= NTSTDIO_OPTION_LF_CRLF;
    384                 }
    385                 else {
    386                         ntstdio.option &= ~NTSTDIO_OPTION_LF_CRLF;
    387                 }
    388                 return 0;
    389         }
     435
    390436        shell_abort();
    391437        return 0;
     
    396442        FILINFO fi;
    397443        FRESULT ret;
    398 #if _USE_LFN
    399         static char lfn[_MAX_LFN + 1];   /* Buffer to store the LFN */
     444#if FF_USE_LFN
     445        static char lfn[FF_MAX_LFN + 1];   /* Buffer to store the LFN */
    400446        fi.lfname = lfn;
    401447        fi.lfsize = sizeof lfn;
    402448#endif
    403449        if (strcmp(path, ".") == 0) {
    404                 char cwd[_MAX_LFN];
     450                char cwd[FF_MAX_LFN];
    405451                if ((ret = f_getcwd(cwd, sizeof(cwd))) != FR_OK) {
    406452                        return fresult2errno(ret);
     
    426472        st->st_mtim.tv_nsec = 0;
    427473        st->st_mtim.tv_sec = fi.fdate + fi.ftime;
    428         st->st_mode  = (S_IRUSR | S_IRGRP | S_IROTH);
     474        st->st_mode = (S_IRUSR | S_IRGRP | S_IROTH);
    429475        st->st_mode |= (fi.fattrib & AM_RDO) ? 0 : (S_IWUSR | S_IWGRP | S_IWOTH);
    430476        st->st_mode |= (fi.fattrib & (AM_DIR | AM_VOL)) ? S_IFDIR : S_IFREG;
     
    485531        BYTE mask = AM_RDO | AM_SYS; // AM_ARC, AM_HID
    486532
    487         if(mode & S_IREAD) {
    488                 if((mode & S_IWRITE) == 0) {
     533        if (mode & S_IREAD) {
     534                if ((mode & S_IWRITE) == 0) {
    489535                        attr |= AM_RDO;
    490536                }
     
    494540        }
    495541
    496         if((res = f_chmod(path, attr, mask)) != FR_OK) {
     542        if ((res = f_chmod(path, attr, mask)) != FR_OK) {
    497543                return fresult2errno(res);
    498544        }
     
    507553        BYTE mask = AM_RDO | AM_SYS; // AM_ARC, AM_HID
    508554
    509         if(mode & S_IREAD) {
    510                 if((mode & S_IWRITE) == 0) {
     555        if (mode & S_IREAD) {
     556                if ((mode & S_IWRITE) == 0) {
    511557                        attr |= AM_RDO;
    512558                }
     
    516562        }
    517563
    518         if((res = f_chmod(path, attr, mask)) != FR_OK) {
     564        if ((res = f_chmod(path, attr, mask)) != FR_OK) {
    519565                return fresult2errno(res);
    520566        }
     
    526572{
    527573        FRESULT ret;
    528         if((ret = f_getcwd(buf, size)) != FR_OK) {
     574        if ((ret = f_getcwd(buf, size)) != FR_OK) {
    529575                return NULL;
    530576        }
     
    549595}
    550596
    551 int dir_close(struct _IO_FILE *fp)
    552 {
    553         FRESULT res;
    554         if ((res = f_closedir(&fp->pdir->dir)) != FR_OK) {
     597int dir_close(struct SHELL_FILE *fp)
     598{
     599        FRESULT res;
     600        if ((res = f_closedir(&((struct SHELL_DIR *)fp->exinf)->dir)) != FR_OK) {
    555601                return fresult2errno(res);
    556602        }
     
    564610                return -EINVAL;
    565611
    566         struct _IO_FILE *fp = fd_to_fp(fd);
     612        struct SHELL_FILE *fp = fd_to_fp(fd);
    567613        if (fp == NULL)
    568614                return -EBADF;
    569615
    570616        FILINFO fno;
    571 #if _USE_LFN
    572         static char lfn[_MAX_LFN + 1];   /* Buffer to store the LFN */
     617#if FF_USE_LFN
     618        static char lfn[FF_MAX_LFN + 1];   /* Buffer to store the LFN */
    573619        fno.lfname = lfn;
    574620        fno.lfsize = sizeof lfn;
    575621#endif
    576622        FRESULT res;
    577         if ((res = f_readdir(&fp->pdir->dir, &fno)) != FR_OK || fno.fname[0] == '\0') {
     623        if ((res = f_readdir(&((struct SHELL_DIR *)fp->exinf)->dir, &fno)) != FR_OK || fno.fname[0] == '\0') {
    578624                return fresult2errno(res);
    579625        }
    580626
    581627        memset(de, 0, sizeof(*de));
    582 #if _USE_LFN
     628#if FF_USE_LFN
    583629        ntlibc_strlcpy(de->d_name, *fno.lfname ? fno.lfname : fno.fname, sizeof(de->d_name));
    584630#else
     
    589635}
    590636
    591 size_t dir_read(struct _IO_FILE *fp, unsigned char *data, size_t len)
     637size_t dir_read(struct SHELL_FILE *fp, unsigned char *data, size_t len)
    592638{
    593639        return -EPERM;
    594640}
    595641
    596 size_t dir_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
     642size_t dir_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len)
    597643{
    598644        return -EPERM;
    599645}
    600646
    601 off_t dir_seek(struct _IO_FILE *fp, off_t ptr, int dir)
     647off_t dir_seek(struct SHELL_FILE *fp, off_t ptr, int dir)
    602648{
    603649        FRESULT res;
     
    607653
    608654        if (ptr == 0) {
    609                 if ((res = f_rewinddir(&fp->pdir->dir)) != FR_OK) {
     655                if ((res = f_rewinddir(&((struct SHELL_DIR *)fp->exinf)->dir)) != FR_OK) {
    610656                        return fresult2errno(res);
    611657                }
     
    613659        else {
    614660                FILINFO fno;
    615 #if _USE_LFN
    616                 static char lfn[_MAX_LFN + 1];   /* Buffer to store the LFN */
     661#if FF_USE_LFN
     662                static char lfn[FF_MAX_LFN + 1];   /* Buffer to store the LFN */
    617663                fno.lfname = lfn;
    618664                fno.lfsize = sizeof lfn;
    619665#endif
    620                 if ((res = f_rewinddir(&fp->pdir->dir)) != FR_OK) {
     666                if ((res = f_rewinddir(&((struct SHELL_DIR *)fp->exinf)->dir)) != FR_OK) {
    621667                        return fresult2errno(res);
    622668                }
    623669
    624670                for (int i = 0; i < ptr; i++) {
    625                         if ((res = f_readdir(&fp->pdir->dir, &fno)) != FR_OK || fno.fname[0] == '\0') {
     671                        if ((res = f_readdir(&((struct SHELL_DIR *)fp->exinf)->dir, &fno)) != FR_OK || fno.fname[0] == '\0') {
    626672                                return fresult2errno(res);
    627673                        }
     
    632678}
    633679
    634 int dir_ioctl(struct _IO_FILE *fp, int req, void *arg)
     680int dir_ioctl(struct SHELL_FILE *fp, int req, void *arg)
    635681{
    636682        return -EINVAL;
     683}
     684
     685bool_t dir_readable(struct SHELL_FILE *fp)
     686{
     687        return fp->readevt_w != fp->readevt_r;
     688}
     689
     690void dir_delete(struct SHELL_FILE *fp)
     691{
     692        free((struct SHELL_DIR *)fp->exinf);
     693        fp->exinf = NULL;
    637694}
    638695
     
    687744{
    688745        //if ((addr >= (void *)&__HeapBase) && (addr + len < (void *)&__HeapLimit)) {
    689                 return 0;
    690         //}
    691         //return -1;
    692 }
    693 
    694 #include "tlsf.h"
    695 
    696 static tlsf_t sys_tlsf;
    697 static pool_t sys_pool;
    698 
    699 void sys_init(void)
    700 {
    701         sys_tlsf = tlsf_create(&__HeapBase);
    702         if (sys_tlsf == NULL)
    703                 return;
    704 
    705         sys_pool = tlsf_add_pool(sys_tlsf, ((uint8_t *)&__HeapBase) + tlsf_size(), ((intptr_t)&__HeapLimit - (intptr_t)&__HeapBase) - tlsf_size());
    706 }
    707 
    708 void sys_fini(void)
    709 {
    710         tlsf_destroy(sys_tlsf);
    711 }
    712 
    713 void *malloc(size_t size)
    714 {
    715         void *result;
    716         wai_sem(SEM_MALLOC);
    717         result = tlsf_malloc(sys_tlsf, size);
    718         sig_sem(SEM_MALLOC);
    719         if (result == NULL)
    720                 tlsf_check_pool(sys_pool);
    721         return result;
    722 }
    723 
    724 void *calloc(size_t size, size_t count)
    725 {
    726         void *result;
    727         wai_sem(SEM_MALLOC);
    728         result = tlsf_malloc(sys_tlsf, count * size);
    729         sig_sem(SEM_MALLOC);
    730         if (result != NULL)
    731                 memset(result, 0, count * size);
    732         else
    733                 tlsf_check_pool(sys_pool);
    734         return result;
    735 }
    736 
    737 void *realloc(void *ptr, size_t size)
    738 {
    739         void *result;
    740         wai_sem(SEM_MALLOC);
    741         result = tlsf_realloc(sys_tlsf, ptr, size);
    742         sig_sem(SEM_MALLOC);
    743         if (result == NULL)
    744                 tlsf_check_pool(sys_pool);
    745         return result;
    746 }
    747 
    748 void free(void *ptr)
    749 {
    750         wai_sem(SEM_MALLOC);
    751         tlsf_free(sys_tlsf, ptr);
    752         sig_sem(SEM_MALLOC);
    753 }
    754 
     746        return 0;
     747//}
     748//return -1;
     749}
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/net_misc.c

    r359 r374  
    6060#include "kernel_cfg.h"
    6161#include "tinet_cfg.h"
    62 #include "util/ntstdio.h"
    63 
    64 extern ntstdio_t ntstdio;
     62#include <stdio.h>
    6563
    6664T_DHCP4_CLI_CONTEXT *dhcp4_cli_initialize(ID tskid, ID cepid);
     
    9795
    9896        get_tid(&nc->tskid);
    99         ntstdio_printf(&ntstdio, "[NET MISC:%d,%d] started.", nc->tskid, (ID)exinf);
     97        printf("[NET MISC:%d,%d] started.", nc->tskid, (ID)exinf);
    10098
    10199        /* 初期化 */
     
    105103        ret = get_tim(&time);
    106104        if (ret != E_OK) {
    107                 ntstdio_printf(&ntstdio, "[NET MISC,%d] get_tim error: %7lu,%s",
     105                printf("[NET MISC,%d] get_tim error: %7lu,%s",
    108106                        nc->cepid, time / SYSTIM_HZ, itron_strerror(ret));
    109107                return;
     
    119117                error = tslp_tsk(timer);
    120118                if ((error != E_OK) && (error != E_TMOUT)) {
    121                         ntstdio_printf(&ntstdio, "[NET MISC,%d] tslp_tsk error: %s %d",
     119                        printf("[NET MISC,%d] tslp_tsk error: %s %d",
    122120                                nc->cepid, itron_strerror(error), timer);
    123121                        break;
     
    126124                ret = get_tim(&time);
    127125                if (ret != E_OK) {
    128                         ntstdio_printf(&ntstdio, "[NET MISC,%d] get_tim error: %s",
     126                        printf("[NET MISC,%d] get_tim error: %s",
    129127                                nc->cepid, itron_strerror(ret));
    130128                        break;
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/netcmd.c

    r364 r374  
    5959#include <netapp/resolver.h>
    6060#include "core/ntlibc.h"
    61 #include "util/ntstdio.h"
     61#include <stdio.h>
    6262#include "ntp_cli.h"
    6363#include "kernel_cfg.h"
    64 
    65 extern ntstdio_t ntstdio;
    6664
    6765#if defined(SUPPORT_INET6)
     
    280278
    281279        if ((line = lookup_ipaddr(&addr, line, apip)) == NULL) {
    282                 ntstdio_printf(&ntstdio, "[PING] unknown host.\n");
     280                printf("[PING] unknown host.\n");
    283281                return 0;
    284282        }
     
    299297#if defined(SUPPORT_INET4)
    300298        if (apip == API_PROTO_IPV6) {
    301                 ntstdio_printf(&ntstdio, "[PING6] size: %d, tmo: %d, host: %s\n", size, tmo, ipv62str(NULL, &addr));
     299                printf("[PING6] size: %d, tmo: %d, host: %s\n", size, tmo, ipv62str(NULL, &addr));
    302300                ping6(&addr, (uint_t)tmo, (uint_t)size);
    303301        }
    304302        else {
    305303                addr4 = ntohl(addr.s6_addr32[3]);
    306                 ntstdio_printf(&ntstdio, "[PING4] size: %d, tmo: %d, host: %s\n", size, tmo, ip2str(NULL, &addr4));
     304                printf("[PING4] size: %d, tmo: %d, host: %s\n", size, tmo, ip2str(NULL, &addr4));
    307305                ping4(&addr4, (uint_t)tmo, (uint_t)size);
    308306        }
    309307#else /* of #if defined(SUPPORT_INET4) */
    310         ntstdio_printf(&ntstdio, "[PING6] size: %d, tmo: %d, host: %s\n", size, tmo, ipv62str(NULL, &addr));
     308        printf("[PING6] size: %d, tmo: %d, host: %s\n", size, tmo, ipv62str(NULL, &addr));
    311309        ping6(&addr, (uint_t)tmo, (uint_t)size);
    312310#endif  /* of #if defined(SUPPORT_INET4) */
    313311#else   /* of #if defined(SUPPORT_INET6) */
    314         ntstdio_printf(&ntstdio, "[PING4] size: %d, tmo: %d, host: %s\n", size, tmo, ip2str(NULL, &addr));
     312        printf("[PING4] size: %d, tmo: %d, host: %s\n", size, tmo, ip2str(NULL, &addr));
    315313        ping4(&addr, (uint_t)tmo, (uint_t)size);
    316314#endif  /* of #if defined(SUPPORT_INET6) */
     
    331329                pos = str_ipv4addr(temp, sizeof(temp), &svaddr, 0);
    332330                temp[pos] = '\0';
    333                 ntstdio_printf(&ntstdio, "DHCPv4 server: %s,\n", temp);
    334                 ntstdio_printf(&ntstdio, "  Renew:       %u:%02u:%02u,\n",
     331                printf("DHCPv4 server: %s,\n", temp);
     332                printf("  Renew:       %u:%02u:%02u,\n",
    335333                        renew / 3600, (renew / 60) % 60, renew % 60);
    336                 ntstdio_printf(&ntstdio, "  Rebind:      %u:%02u:%02u, Expire:   %u:%02u:%02u.\n",
     334                printf("  Rebind:      %u:%02u:%02u, Expire:   %u:%02u:%02u.\n",
    337335                        rebind / 3600, (rebind / 60) % 60, rebind % 60,
    338336                        expire / 3600, (expire / 60) % 60, expire % 60);
    339337        }
    340338        else if (ret == E_OBJ)
    341                 ntstdio_printf(&ntstdio, "DHCPv4 server: not available.\n");
     339                printf("DHCPv4 server: not available.\n");
    342340}
    343341
     
    351349        if (ntlibc_strcmp(argv[1], "rel") == 0) {
    352350                ret = dhcp4c_rel_info();
    353                 ntstdio_printf(&ntstdio, "dhcp4c_rel_info %d\n", ret);
     351                printf("dhcp4c_rel_info %d\n", ret);
    354352        }
    355353        else if (ntlibc_strcmp(argv[1], "renew") == 0) {
    356354                ret = dhcp4c_renew_info();
    357                 ntstdio_printf(&ntstdio, "dhcp4c_renew_info %d\n", ret);
     355                printf("dhcp4c_renew_info %d\n", ret);
    358356        }
    359357        else {
     
    383381                else {
    384382                        for (c = 1; c <= *ptr; c++)
    385                                 ntstdio_printf(&ntstdio, "%c", *(ptr + c));
     383                                printf("%c", *(ptr + c));
    386384                        ptr += *ptr + 1;
    387385                        if (*ptr)
    388                                 ntstdio_printf(&ntstdio, ".");
     386                                printf(".");
    389387                }
    390388        }
     
    406404                return error;
    407405
    408         ntstdio_printf(&ntstdio, "    mname:   ");
     406        printf("    mname:   ");
    409407        rn_offset = s_show_dns_domain_name(msg, offset);
    410         ntstdio_putc(&ntstdio, '\n');
    411         ntstdio_printf(&ntstdio, "    rname:   ");
     408        putchar('\n');
     409        printf("    rname:   ");
    412410        s_show_dns_domain_name(msg, rn_offset);
    413         ntstdio_putc(&ntstdio, '\n');
    414 
    415         ntstdio_printf(&ntstdio, "    serial:  %d\n", soa.serial);
    416         ntstdio_printf(&ntstdio, "    refresh: %d\n", soa.refresh);
    417         ntstdio_printf(&ntstdio, "    retry:   %d\n", soa.retry);
    418         ntstdio_printf(&ntstdio, "    expirel: %d\n", soa.expire);
    419         ntstdio_printf(&ntstdio, "    minimum: %d\n", soa.minimum);
     411        putchar('\n');
     412
     413        printf("    serial:  %d\n", soa.serial);
     414        printf("    refresh: %d\n", soa.refresh);
     415        printf("    retry:   %d\n", soa.retry);
     416        printf("    expirel: %d\n", soa.expire);
     417        printf("    minimum: %d\n", soa.minimum);
    420418
    421419        return E_OK;
     
    433431        int             scount;
    434432
    435         ntstdio_printf(&ntstdio, "question   section: %d\n", rslv->dns_hdr.qdcount);
     433        printf("question   section: %d\n", rslv->dns_hdr.qdcount);
    436434        offset = rslv->qd_offset;
    437435        for (scount = 1; scount <= rslv->dns_hdr.qdcount; scount++) {
     
    439437                        return error;
    440438
    441                 ntstdio_printf(&ntstdio, "%2d: ", scount);
     439                printf("%2d: ", scount);
    442440                s_show_dns_domain_name(msg, offset);
    443                 ntstdio_printf(&ntstdio, "\n    type: %-4s, class: %2s\n", dns_strtype(qd.type), dns_strclass(qd.class));
     441                printf("\n    type: %-4s, class: %2s\n", dns_strtype(qd.type), dns_strclass(qd.class));
    444442                offset = error;
    445443        }
     
    463461        int pos;
    464462
    465         ntstdio_printf(&ntstdio, "%10s section: %d\n", title, scount);
     463        printf("%10s section: %d\n", title, scount);
    466464        for (count = 1; count <= scount; count++) {
    467465                if ((error = dns_analyze_rr(&rr, offset, msg, length)) < 0)
    468466                        return error;
    469467
    470                 ntstdio_printf(&ntstdio, "%2d: ", count);
     468                printf("%2d: ", count);
    471469                s_show_dns_domain_name(msg, offset);
    472                 ntstdio_printf(&ntstdio, "\n    type: %-4s, class: %2s, TTL: %2d, len: %3d, offset: 0x%02x\n",
     470                printf("\n    type: %-4s, class: %2s, TTL: %2d, len: %3d, offset: 0x%02x\n",
    473471                        dns_strtype(rr.type), dns_strclass(rr.class), rr.ttl, rr.rdlength, rr.rdata_offset);
    474472
     
    479477                        pos = str_ipv4addr(temp, sizeof(temp), &in4_addr, 0);
    480478                        temp[pos] = '\0';
    481                         ntstdio_printf(&ntstdio, "    IPv4 addr: %s\n", temp);
     479                        printf("    IPv4 addr: %s\n", temp);
    482480                        break;
    483481                case DNS_TYPE_NS:
    484                         ntstdio_printf(&ntstdio, "    host: ");
     482                        printf("    host: ");
    485483                        s_show_dns_domain_name(msg, rr.rdata_offset);
    486                         ntstdio_putc(&ntstdio, '\n');
     484                        putchar('\n');
    487485                        break;
    488486                case DNS_TYPE_CNAME:
    489                         ntstdio_printf(&ntstdio, "    host: ");
     487                        printf("    host: ");
    490488                        s_show_dns_domain_name(msg, rr.rdata_offset);
    491                         ntstdio_putc(&ntstdio, '\n');
     489                        putchar('\n');
    492490                        break;
    493491                case DNS_TYPE_SOA:
     
    495493                        break;
    496494                case DNS_TYPE_PTR:
    497                         ntstdio_printf(&ntstdio, "     PTR: ");
     495                        printf("     PTR: ");
    498496                        s_show_dns_domain_name(msg, rr.rdata_offset);
    499                         ntstdio_putc(&ntstdio, '\n');
     497                        putchar('\n');
    500498                        break;
    501499                case DNS_TYPE_AAAA:
     
    503501                        pos = str_ipv6addr(temp, sizeof(temp), &in6_addr, 0);
    504502                        temp[pos] = '\0';
    505                         ntstdio_printf(&ntstdio, "    IPv6 addr: %s\n", temp);
     503                        printf("    IPv6 addr: %s\n", temp);
    506504                        break;
    507505                default:
    508                         ntstdio_printf(&ntstdio, "    data: ");
     506                        printf("    data: ");
    509507                        col = 32;
    510508                        for (dcount = 0; dcount < rr.rdlength; dcount++) {
    511                                 ntstdio_printf(&ntstdio, "%02x", *(msg + rr.rdata_offset + dcount));
     509                                printf("%02x", *(msg + rr.rdata_offset + dcount));
    512510                                if (--col == 0) {
    513                                         ntstdio_printf(&ntstdio, "\n          ");
     511                                        printf("\n          ");
    514512                                        col = 32;
    515513                                }
    516514                        }
    517                         ntstdio_putc(&ntstdio, '\n');
     515                        putchar('\n');
    518516                        break;
    519517                }
     
    539537#if defined(SUPPORT_INET6)
    540538
    541         ntstdio_printf(&ntstdio, "domain name:     %s\n", dns_in6_get_dname());
     539        printf("domain name:     %s\n", dns_in6_get_dname());
    542540
    543541#else   /* of #if defined(SUPPORT_INET6) */
    544542
    545         ntstdio_printf(&ntstdio, "domain name:     %s\n", dns_in4_get_dname());
     543        printf("domain name:     %s\n", dns_in4_get_dname());
    546544
    547545#endif  /* of #if defined(SUPPORT_INET6) */
     
    549547#if defined(SUPPORT_INET6)
    550548        dns_in6_get_addr(&in6_addr);
    551         ntstdio_printf(&ntstdio, "IPv6 DNS server: ");
     549        printf("IPv6 DNS server: ");
    552550        if (IN6_IS_ADDR_UNSPECIFIED(&in6_addr))
    553                 ntstdio_printf(&ntstdio, "not available.\n");
     551                printf("not available.\n");
    554552        else {
    555553                pos = str_ipv6addr(temp, sizeof(temp), &in6_addr, 0);
    556554                temp[pos] = '\0';
    557                 ntstdio_printf(&ntstdio, "%s.\n", temp);
     555                printf("%s.\n", temp);
    558556        }
    559557#endif  /* of #if defined(SUPPORT_INET6) */
     
    561559#if defined(SUPPORT_INET4)
    562560        dns_in4_get_addr(&in4_addr);
    563         ntstdio_printf(&ntstdio, "IPv4 DNS server: ");
     561        printf("IPv4 DNS server: ");
    564562        if (in4_addr == IPV4_ADDRANY)
    565                 ntstdio_printf(&ntstdio, "not available.\n");
     563                printf("not available.\n");
    566564        else {
    567565                pos = str_ipv4addr(temp, sizeof(temp), &in4_addr, 0);
    568566                temp[pos] = '\0';
    569                 ntstdio_printf(&ntstdio, "%s.\n", temp);
     567                printf("%s.\n", temp);
    570568        }
    571569#endif  /* of #if defined(SUPPORT_INET4) */
     
    604602        line = skip_blanks(resolv_options(&flags, line, DEFAULT_API_PROTO));
    605603        if ((flags & (DNS_LUP_FLAGS_PROTO_IPV6 | DNS_LUP_FLAGS_PROTO_IPV4)) == 0) {
    606                 ntstdio_printf(&ntstdio, "DNS server not available.\n");
     604                printf("DNS server not available.\n");
    607605                return 0;
    608606        }
     
    620618
    621619        if ((error = tget_mpf(MPF_RSLV_SRBUF, (void*)&msg, TMO_FEVR)) != E_OK) {
    622                 ntstdio_printf(&ntstdio, "get buffer error: %s.\n", itron_strerror(error));
     620                printf("get buffer error: %s.\n", itron_strerror(error));
    623621                return 0;
    624622        }
    625623
    626624        if ((length = dns_lookup_host(flags | DNS_LUP_FLAGS_MSG, line, msg, DNS_UDP_MSG_LENGTH, &rslv)) < 0) {
    627                 //ntstdio_printf(&ntstdio, "error: %s.\n", itron_strerror(length));
     625                //printf("error: %s.\n", itron_strerror(length));
    628626                goto err_ret;
    629627        }
    630628
    631629        dly_tsk(1 * 1000);
    632         ntstdio_printf(&ntstdio, "DNS header: flags: ");
     630        printf("DNS header: flags: ");
    633631        if (rslv.dns_hdr.code & (DNS_QR_RESPONSE | DNS_AUTHORITATIVE |
    634632                DNS_TRUN_CATION | DNS_RECURSION_DESIRED | DNS_RECURSION_AVAILABLE)) {
    635                 ntstdio_printf(&ntstdio, (rslv.dns_hdr.code & DNS_QR_RESPONSE) ? "QR," : "");
    636                 ntstdio_printf(&ntstdio, (rslv.dns_hdr.code & DNS_AUTHORITATIVE) ? "AA," : "");
    637                 ntstdio_printf(&ntstdio, (rslv.dns_hdr.code & DNS_TRUN_CATION) ? "TC," : "");
    638                 ntstdio_printf(&ntstdio, (rslv.dns_hdr.code & DNS_RECURSION_DESIRED) ? "RD," : "");
    639                 ntstdio_printf(&ntstdio, (rslv.dns_hdr.code & DNS_RECURSION_AVAILABLE) ? "RA," : "");
    640                 ntstdio_printf(&ntstdio, " ");
    641         }
    642         ntstdio_printf(&ntstdio, "opcode: ");
    643         ntstdio_printf(&ntstdio, (rslv.dns_hdr.code & DNS_OPCODE_REVERSE) ? "RV" : "FW");
    644         ntstdio_printf(&ntstdio, (rslv.dns_hdr.code & DNS_OPCODE_STATUS) ? ",ST" : "");
    645         ntstdio_printf(&ntstdio, ", rcode: %s.\n",
     633                printf((rslv.dns_hdr.code & DNS_QR_RESPONSE) ? "QR," : "");
     634                printf((rslv.dns_hdr.code & DNS_AUTHORITATIVE) ? "AA," : "");
     635                printf((rslv.dns_hdr.code & DNS_TRUN_CATION) ? "TC," : "");
     636                printf((rslv.dns_hdr.code & DNS_RECURSION_DESIRED) ? "RD," : "");
     637                printf((rslv.dns_hdr.code & DNS_RECURSION_AVAILABLE) ? "RA," : "");
     638                printf(" ");
     639        }
     640        printf("opcode: ");
     641        printf((rslv.dns_hdr.code & DNS_OPCODE_REVERSE) ? "RV" : "FW");
     642        printf((rslv.dns_hdr.code & DNS_OPCODE_STATUS) ? ",ST" : "");
     643        printf(", rcode: %s.\n",
    646644                (rslv.dns_hdr.code & DNS_RCODE_MASK) > DNS_RCODE_REFUSED
    647645                ? "6" : rcode_str[rslv.dns_hdr.code & DNS_RCODE_MASK]);
    648646
    649647        if ((offset = show_dns_qdsection(msg, length, &rslv)) < 0) {
    650                 ntstdio_printf(&ntstdio, "msg error: %s.\n", itron_strerror(offset));
     648                printf("msg error: %s.\n", itron_strerror(offset));
    651649        }
    652650        if ((offset = show_dns_section(msg, length, rslv.dns_hdr.ancount, rslv.an_offset, "answer")) < 0) {
    653                 ntstdio_printf(&ntstdio, "msg error: %s.\n", itron_strerror(offset));
     651                printf("msg error: %s.\n", itron_strerror(offset));
    654652        }
    655653        if ((offset = show_dns_section(msg, length, rslv.dns_hdr.nscount, rslv.ns_offset, "authority")) < 0) {
    656                 ntstdio_printf(&ntstdio, "msg error: %s.\n", itron_strerror(offset));
     654                printf("msg error: %s.\n", itron_strerror(offset));
    657655        }
    658656        if ((offset = show_dns_section(msg, length, rslv.dns_hdr.arcount, rslv.ar_offset, "additional")) < 0) {
    659                 ntstdio_printf(&ntstdio, "msg error: %s.\n", itron_strerror(offset));
     657                printf("msg error: %s.\n", itron_strerror(offset));
    660658        }
    661659
    662660err_ret:
    663661        if ((error = rel_mpf(MPF_RSLV_SRBUF, msg)) != E_OK)
    664                 ntstdio_printf(&ntstdio, "release buffer error: %s.\n", itron_strerror(error));
     662                printf("release buffer error: %s.\n", itron_strerror(error));
    665663        return 0;
    666664}
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/ntp_cli.c

    r364 r374  
    5050#include <t_syslog.h>
    5151#include "kernel_cfg.h"
    52 #include "util/ntstdio.h"
    53 
    54 extern ntstdio_t ntstdio;
     52#include <stdio.h>
    5553
    5654#endif  /* of #if defined(TARGET_KERNEL_ASP) */
     
    279277        }
    280278
    281         ntstdio_printf(&ntstdio, "[NTP CLI,%d] recv time: %s .%09u\n",
     279        printf("[NTP CLI,%d] recv time: %s .%09u\n",
    282280                nc->cepid, nc->buf, tp.tv_nsec);
    283281}
     
    311309                line = lookup_ipaddr(&nc->ipaddr6, NTP_SRV_URL, API_PROTO_IPV4);
    312310                if (line == NULL || !in6_is_addr_ipv4mapped(&nc->ipaddr6)) {
    313                         ntstdio_printf(&ntstdio, "[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
     311                        printf("[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
    314312                                nc->cepid, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ);
    315313                        nc->timer = SLP_ITV;
     
    319317#else   /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) */
    320318                if ((line = lookup_ipaddr(&nc->snd_rmt.ipaddr, NTP_SRV_URL, DEFAULT_API_PROTO)) == NULL) {
    321                         ntstdio_printf(&ntstdio, "[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
     319                        printf("[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
    322320                                nc->cepid, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ);
    323321                        nc->timer = SLP_ITV;
     
    423421
    424422        if ((error = udp_snd_dat(nc->cepid, &nc->snd_rmt, ntp, len, TMO_NBLK)) != E_WBLK) {
    425                 ntstdio_printf(&ntstdio, "[NTP CLI,%d] udp_snd_dat error: %s",
     423                printf("[NTP CLI,%d] udp_snd_dat error: %s",
    426424                        nc->cepid, itron_strerror(error));
    427425                return error;
     
    441439        ret = get_tim(&time);
    442440        if (ret != E_OK) {
    443                 ntstdio_printf(&ntstdio, "[NTP CLI,%d] get_tim error: %s",
     441                printf("[NTP CLI,%d] get_tim error: %s",
    444442                        nc->cepid, itron_strerror(ret));
    445443                tp->tv_sec = 0;
     
    461459        ret = set_tim(time);
    462460        if (ret != E_OK) {
    463                 ntstdio_printf(&ntstdio, "[NTP CLI,%d] set_tim error: %s",
     461                printf("[NTP CLI,%d] set_tim error: %s",
    464462                        nc->cepid, itron_strerror(ret));
    465463        }
     
    479477        if (len < 0 && len != E_RLWAI) {
    480478                /* E_RLWAI 以外で、0 以下の場合は、エラーを意味している。*/
    481                 ntstdio_printf(&ntstdio, "[NTP CLI,%d] callback error: %s, fncd: %s", nc->cepid,
     479                printf("[NTP CLI,%d] callback error: %s, fncd: %s", nc->cepid,
    482480                        itron_strerror(len), in_strtfn(fncd));
    483481        }
     
    486484                        if ((len = udp_rcv_dat(nc->cepid, &nc->rcv_rmt, &nc->ntp_msg, len, TMO_POL)) < 0)
    487485                        {
    488                                 ntstdio_printf(&ntstdio, "[NTP CLI,%d] udp_rcv_dat error: %s", nc->cepid,
     486                                printf("[NTP CLI,%d] udp_rcv_dat error: %s", nc->cepid,
    489487                                        itron_strerror(len));
    490488                        }
     
    518516
    519517        get_tid(&nc->tskid);
    520         ntstdio_printf(&ntstdio, "[NTP CLI:%d,%d] started.", nc->tskid, (ID)exinf);
     518        printf("[NTP CLI:%d,%d] started.", nc->tskid, (ID)exinf);
    521519
    522520        /* 初期化 */
     
    525523        ret = get_tim(&time);
    526524        if (ret != E_OK) {
    527                 ntstdio_printf(&ntstdio, "[NTP CLI,%d] get_tim error: %7lu,%s",
     525                printf("[NTP CLI,%d] get_tim error: %7lu,%s",
    528526                        nc->cepid, time / SYSTIM_HZ, itron_strerror(ret));
    529527                return;
     
    539537                error = tslp_tsk(timer);
    540538                if ((error != E_OK) && (error != E_TMOUT)) {
    541                         ntstdio_printf(&ntstdio, "[NTP CLI,%d] tslp_tsk error: %s %d",
     539                        printf("[NTP CLI,%d] tslp_tsk error: %s %d",
    542540                                nc->cepid, itron_strerror(error), timer);
    543541                        break;
     
    546544                ret = get_tim(&time);
    547545                if (ret != E_OK) {
    548                         ntstdio_printf(&ntstdio, "[NTP CLI,%d] get_tim error: %s",
     546                        printf("[NTP CLI,%d] get_tim error: %s",
    549547                                nc->cepid, itron_strerror(ret));
    550548                        break;
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/ntshell_main.c

    r364 r374  
    5959#include "ntshell_main.h"
    6060#include "socket_stub.h"
    61 #include "usb_hbth.h"
    62 
    63 extern int bt_bnep_mode;
    6461
    6562char command[NTOPT_TEXT_MAXLEN];
    66 ntstdio_t ntstdio;
    6763
    6864extern uint8_t mac_addr[6];
     
    8783volatile int ntshell_state;
    8884jmp_buf process_exit;
    89 void sys_init(void);
    90 NTSHELL_SERIAL_READ ntshell_serial_read = 0;
    91 NTSHELL_SERIAL_WRITE ntshell_serial_write = 0;
    92 void *ntshell_serial_extobj;
    93 
    94 unsigned char ntstdio_xi(struct ntstdio_t *handle)
    95 {
    96         unsigned char buf[1];
    97         ntshell_serial_read((char *)buf, 1, ntshell_serial_extobj);
    98         return buf[0];
    99 }
    100 
    101 void ntstdio_xo(struct ntstdio_t *handle, unsigned char c)
    102 {
    103         char buf[1];
    104         buf[0] = c;
    105         ntshell_serial_write(buf, 1, ntshell_serial_extobj);
    106 }
    107 
    108 void ntshell_task_init(NTSHELL_SERIAL_READ func_read,
    109         NTSHELL_SERIAL_WRITE func_write, void *extobj)
    110 {
    111         ntshell_serial_read = func_read;
    112         ntshell_serial_write = func_write;
    113         ntshell_serial_extobj = extobj;
    114 
    115         sys_init();
    116 
    117         ntstdio_init(&ntstdio, NTSTDIO_OPTION_LINE_ECHO | NTSTDIO_OPTION_CANON | NTSTDIO_OPTION_LF_CRLF | NTSTDIO_OPTION_LF_CR, ntstdio_xi, ntstdio_xo);
     85
     86void ntshell_task_init(ID portid)
     87{
     88        serial_ctl_por(portid, IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV);
    11889}
    11990
     
    177148        const cmd_table_t *p = cmd_table_info.table;
    178149        for (int i = 0; i < cmd_table_info.count; i++) {
    179                 ntstdio_puts(&ntstdio, p->cmd);
    180                 ntstdio_puts(&ntstdio, "\t:");
    181                 ntstdio_puts(&ntstdio, p->desc);
    182                 ntstdio_puts(&ntstdio, "\n");
     150                fwrite(p->cmd, strlen(p->cmd), 1, stdout);
     151                fwrite("\t:", strlen("\t:"), 1, stdout);
     152                puts(p->desc);
    183153                p++;
    184154        }
     
    206176int execute_command(int wait)
    207177{
     178        T_RTSK rtsk;
    208179        ER ret;
    209180
     
    228199        do {
    229200                tslp_tsk(100000);
     201
     202                ret = ref_tsk(NTSHELL_TASK, &rtsk);
     203                if ((ret != E_OK) || (rtsk.tskstat == TTS_DMT))
     204                        ntshell_state = 3;
    230205        } while(ntshell_state == 1);
    231206
     
    237212        ntlibc_strlcpy(command, text, sizeof(command));
    238213        return execute_command(1);
    239 }
    240 
    241 int stdio_close(struct _IO_FILE *fp)
    242 {
    243         return -EPERM;
    244 }
    245 
    246 size_t stdio_read(struct _IO_FILE *fp, unsigned char *data, size_t len)
    247 {
    248         return -EPERM;
    249 }
    250 
    251 size_t stdio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
    252 {
    253         return -EPERM;
    254 }
    255 
    256 size_t stdin_read(struct _IO_FILE *fp, unsigned char *data, size_t len)
    257 {
    258         int i = 0;
    259         while (i < len) {
    260                 int c = ntstdio_getc(&ntstdio);
    261                 data[i++] = c;
    262                 if ((c == EOF) || (c == '\n'))
    263                         break;
    264         }
    265         return i;
    266 }
    267 
    268 size_t stdout_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
    269 {
    270         for (int i = 0; i < len; i++) {
    271                 ntstdio_putc(&ntstdio, data[i]);
    272         }
    273         return len;
    274 }
    275 
    276 size_t stderr_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
    277 {
    278         for (int i = 0; i < len; i++) {
    279                 ntstdio_putc(&ntstdio, data[i]);
    280         }
    281         return len;
    282 }
    283 
    284 int sio_close(struct _IO_FILE *fp)
    285 {
    286         return -EPERM;
    287 }
    288 
    289 size_t sio_read(struct _IO_FILE *fp, unsigned char *data, size_t len)
    290 {
    291         return -EPERM;
    292 }
    293 
    294 size_t sio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
    295 {
    296         return -EPERM;
    297 }
    298 
    299 off_t sio_seek(struct _IO_FILE *fp, off_t ofs, int org)
    300 {
    301         return -EPERM;
    302 }
    303 
    304 int sio_ioctl(struct _IO_FILE *fp, int request, void *arg)
    305 {
    306         switch (request) {
    307         case TIOCGWINSZ:
    308                 return 0;
    309         case TCGETS:
    310                 return sio_tcgetattr(fp->fd, (struct termios *)arg);
    311         case TCSETS + TCSANOW:
    312         case TCSETS + TCSADRAIN:
    313         case TCSETS + TCSAFLUSH:
    314                 return sio_tcsetattr(fp->fd, request - TCSETS, (const struct termios *)arg);
    315         }
    316 
    317         return -EINVAL;
    318214}
    319215
     
    456352}
    457353
     354int shell_kill(int pid, int sig)
     355{
     356        DebugBreak();
     357        return -1;
     358}
     359
     360int shell_gettimeofday(struct timeval *tv, void *tzvp)
     361{
     362        SYSTIM time;
     363        if (!tv) return 0;
     364        get_tim(&time);
     365        tv->tv_sec = time / 1000000;
     366        tv->tv_usec = time - (tv->tv_sec * 1000000);
     367        return 0;
     368}
     369
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/ntshell_main.cfg

    r364 r374  
    4141#include "ntshell_main.h"
    4242
    43 CRE_TSK(NTSHELL_TASK, { TA_NULL, 0, ntshell_task, NTSHELL_PRIORITY, NTSHELL_STACK_SIZE, NULL });
     43ATT_INI({ TA_NULL, 0, sys_init });
     44
     45CRE_TSK(NTSHELL_TASK, { TA_FPU, 0, ntshell_task, NTSHELL_PRIORITY, NTSHELL_STACK_SIZE, NULL });
    4446CRE_FLG(FLG_SELECT_WAIT, { TA_WMUL, 0x00 });
    4547CRE_SEM(SEM_FILEDESC, { TA_TPRI, 1, 1 });
    46 CRE_SEM(SEM_MALLOC, { TA_TPRI, 1, 1 });
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/ntshell_main.h

    r367 r374  
    7676extern PRI main_task_priority;
    7777
     78/* ntshellの初期化 */
     79void sys_init(intptr_t exinf);
     80
    7881/* ntshellタスク初期化 */
    79 void ntshell_task_init(NTSHELL_SERIAL_READ func_read,
    80         NTSHELL_SERIAL_WRITE func_write, void *extobj);
     82void ntshell_task_init(ID portid);
    8183
    8284/* ntshellタスク */
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/shellif.h

    r364 r374  
    134134
    135135// dirent.h
    136 typedef struct __dirstream DIR;
     136typedef struct __dirstream FATFS_DIR;
    137137
    138138int shell_getdents(int, struct dirent *, size_t);
     
    303303#endif
    304304
    305 struct tm *gmtime_r(const time_t *t, struct tm *tm);
    306305void *malloc(size_t size);
    307306void *calloc(size_t size, size_t count);
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/socket_stub.c

    r364 r374  
    5757#include <netinet/udp_var.h>
    5858#include <net/net_buf.h>
    59 //#include <netinet/tcp_var.h>
     59#include <netinet/udp.h>
     60#include <netinet/udp_var.h>
     61#include <netinet/tcp.h>
     62#include <netinet/tcp_var.h>
    6063#include <netapp/resolver.h>
    6164extern const ID tmax_tcp_cepid;
     
    6467#include "kernel_cfg.h"
    6568
     69#ifdef _DEBUG
     70static const char THIS_FILE[] = __FILE__;
     71#endif
     72
    6673#define SOCKET_TIMEOUT 2000000
     74
     75static int tcp_fd_close(struct SHELL_FILE *fp);
     76static size_t tcp_fd_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
     77static size_t tcp_fd_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
     78static off_t tcp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org);
     79static int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg);
     80static bool_t tcp_fd_readable(struct SHELL_FILE *fp);
     81static void tcp_fd_delete(struct SHELL_FILE *fp);
     82
     83static int udp_fd_close(struct SHELL_FILE *fp);
     84static size_t udp_fd_read(struct SHELL_FILE *fp, unsigned char *data, size_t len);
     85static size_t udp_fd_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len);
     86static off_t udp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org);
     87static int udp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg);
     88static bool_t udp_fd_readable(struct SHELL_FILE *fp);
     89static void udp_fd_delete(struct SHELL_FILE *fp);
     90
     91IO_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 };
     92IO_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 };
    6793
    6894typedef struct id_table_t {
     
    116142}
    117143
    118 int delete_tcp_rep(int repid)
    119 {
    120         return delete_tcp_fd(tmax_tcp_cepid + repid);
    121 }
    122 
    123 typedef struct _IO_FILE SOCKET;
     144typedef struct SHELL_FILE SOCKET;
    124145
    125146int shell_socket(int family, int type, int protocol)
     
    141162        switch (type) {
    142163        case SOCK_STREAM:
    143                 fp = new_tcp_fd(0);
     164                fp = new_fp(&IO_TYPE_TCP, 0, 0);
     165                if (fp == NULL)
     166                        return -ENOMEM;
     167
     168                fp->exinf = malloc(sizeof(socket_t));
     169                memset(fp->exinf, 0, sizeof(socket_t));
    144170                break;
    145171        case SOCK_DGRAM:
    146                 fp = new_udp_fd(0);
     172                fp = new_fp(&IO_TYPE_UDP, 0, 1);
     173                if (fp == NULL)
     174                        return -ENOMEM;
     175
     176                fp->exinf = malloc(sizeof(socket_t));
     177                memset(fp->exinf, 0, sizeof(socket_t));
    147178                break;
    148179        default:
     
    150181        }
    151182
    152         if (fp == NULL) {
    153                 return -ENOMEM;
    154         }
    155 
    156         fp->psock->family = family;
    157         fp->psock->type = type;
    158         fp->psock->protocol = protocol;
    159         fp->psock->flags = flags;
     183        socket_t *socket = (socket_t *)fp->exinf;
     184        socket->family = family;
     185        socket->type = type;
     186        socket->protocol = protocol;
     187        socket->flags = flags;
    160188
    161189        return fp->fd;
     
    167195        if (fp == NULL)
    168196                return -EBADF;
    169         if (fp->psock->family != addr->sa_family)
     197        socket_t *socket = (socket_t *)fp->exinf;
     198        if (socket->family != addr->sa_family)
    170199                return -EINVAL;
    171200
     
    177206                }
    178207                struct sockaddr_in *addr_in = (struct sockaddr_in *)addr;
    179                 memcpy(&fp->psock->laddr4, addr, len);
    180                 switch (fp->psock->type) {
     208                memcpy(&socket->laddr4, addr, len);
     209                switch (socket->type) {
    181210                case SOCK_STREAM: {
    182211                        ID cepid = new_id(tcp_cepid_table, tcp_cepid_table_count);
     
    184213                                return -ENOMEM;
    185214
    186                         fp->psock->buf_size = 512 + 512;
    187                         fp->psock->buf = malloc(fp->psock->buf_size);
     215                        socket->buf_size = 512 + 512;
     216                        socket->buf = malloc(socket->buf_size);
    188217#ifdef _DEBUG
    189                         memset(fp->psock->buf, 0, fp->psock->buf_size);
     218                        memset(socket->buf, 0, socket->buf_size);
    190219#endif
    191                         T_TCP_CCEP ccep = { 0, fp->psock->buf, 512, &fp->psock->buf[512], 512, (FP)socket_tcp_callback };
     220                        T_TCP_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp_callback };
    192221                        ret = tcp_cre_cep(cepid, &ccep);
    193222                        if (ret != E_OK) {
     
    196225                        }
    197226                        fp->handle = cepid;
    198                         fp->psock->cepid = cepid;
     227                        socket->cepid = cepid;
    199228                        break;
    200229                }
     
    211240                        }
    212241                        fp->handle = cepid;
    213                         fp->psock->cepid = cepid;
     242                        socket->cepid = cepid;
    214243                        break;
    215244                }
     
    223252                        return -EINVAL;
    224253                }
    225                 memcpy(&fp->psock->laddr4, addr, len);
     254                memcpy(&socket->laddr4, addr, len);
    226255                break;
    227256        }
     
    236265        if (fp == NULL)
    237266                return -EBADF;
    238         if (fp->psock->type != SOCK_STREAM)
     267        socket_t *socket = (socket_t *)fp->exinf;
     268        if (socket->type != SOCK_STREAM)
    239269                return -EINVAL;
    240270
    241         fp->psock->backlog = backlog;
     271        socket->backlog = backlog;
    242272
    243273        ER ret;
    244         switch (fp->psock->family) {
     274        switch (socket->family) {
    245275        case AF_INET: {
    246276                ID repid = new_id(tcp_repid_table, tcp_repid_table_count);
     
    248278                        return -ENOMEM;
    249279
    250                 struct sockaddr_in *laddr = &fp->psock->laddr4;
     280                struct sockaddr_in *laddr = &socket->laddr4;
    251281                T_TCP_CREP crep = { 0, {ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port)} };
    252282                ret = tcp_cre_rep(repid, &crep);
     
    255285                        return -ENOMEM;
    256286                }
    257                 fp->psock->repid = repid;
     287                socket->repid = repid;
    258288                break;
    259289        }
     
    271301        if (fp == NULL)
    272302                return -EBADF;
    273         if (fp->psock->type != SOCK_STREAM)
     303        socket_t *socket = (socket_t *)fp->exinf;
     304        if (socket->type != SOCK_STREAM)
    274305                return -EINVAL;
    275306
    276307        ER ret;
    277         switch (fp->psock->family) {
     308        switch (socket->family) {
    278309        case AF_INET: {
    279310                if (len < 8) {
    280311                        return -EINVAL;
    281312                }
    282                 if (fp->psock->cepid == 0) {
     313                if (socket->cepid == 0) {
    283314                        ID cepid = new_id(tcp_cepid_table, tcp_cepid_table_count);
    284315                        if (cepid < 0)
    285316                                return -ENOMEM;
    286317
    287                         fp->psock->buf_size = 512 + 512;
    288                         fp->psock->buf = malloc(fp->psock->buf_size);
     318                        socket->buf_size = 512 + 512;
     319                        socket->buf = malloc(socket->buf_size);
    289320#ifdef _DEBUG
    290                         memset(fp->psock->buf, 0, fp->psock->buf_size);
     321                        memset(socket->buf, 0, socket->buf_size);
    291322#endif
    292                         T_TCP_CCEP ccep = { 0, fp->psock->buf, 512, &fp->psock->buf[512], 512, (FP)socket_tcp_callback };
     323                        T_TCP_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp_callback };
    293324                        ret = tcp_cre_cep(cepid, &ccep);
    294325                        if (ret != E_OK) {
     
    297328                        }
    298329                        fp->handle = cepid;
    299                         fp->psock->cepid = cepid;
    300                 }
    301                 struct sockaddr_in *laddr = &fp->psock->laddr4;
    302                 struct sockaddr_in *raddr = &fp->psock->raddr4;
     330                        socket->cepid = cepid;
     331                }
     332                struct sockaddr_in *laddr = &socket->laddr4;
     333                struct sockaddr_in *raddr = &socket->raddr4;
    303334                memset(raddr, 0, sizeof(*raddr));
    304335                memcpy(raddr, addr, len);
    305336                T_IPV4EP lep = { ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port) };
    306337                T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) };
    307                 ret = tcp_con_cep(fp->psock->cepid, &lep, &rep, SOCKET_TIMEOUT);
     338                ret = tcp_con_cep(socket->cepid, &lep, &rep, SOCKET_TIMEOUT);
    308339                if (ret < 0) {
    309340                        return -EHOSTUNREACH;
     
    324355        if (lfp == NULL)
    325356                return -EBADF;
    326         if (lfp->psock->type != SOCK_STREAM)
     357        if (((socket_t *)lfp->exinf)->type != SOCK_STREAM)
    327358                return -EINVAL;
    328359
    329         SOCKET *fp = new_tcp_fd(0);
    330         if (fp == NULL) {
     360        SOCKET *fp = new_fp(&IO_TYPE_TCP, 0, 0);
     361        if (fp == NULL)
    331362                return -ENOMEM;
    332         }
    333 
    334         memcpy(fp->psock, lfp->psock, offsetof(socket_t, buf_size));
     363
     364        fp->exinf = malloc(sizeof(socket_t));
     365        memset(fp->exinf, 0, sizeof(socket_t));
     366
     367        memcpy(fp->exinf, lfp->exinf, offsetof(socket_t, buf_size));
    335368
    336369        ER ret;
    337         switch (fp->psock->family) {
     370        socket_t *socket = (socket_t *)fp->exinf;
     371        switch (socket->family) {
    338372        case AF_INET: {
    339373                ID cepid;
    340                 if (fp->psock->cepid == 0) {
     374                if (socket->cepid == 0) {
    341375                        cepid = new_id(tcp_cepid_table, tcp_cepid_table_count);
    342376                        if (cepid < 0)
    343377                                return -ENOMEM;
    344378
    345                         fp->psock->buf_size = 512 + 512;
    346                         fp->psock->buf = malloc(fp->psock->buf_size);
     379                        socket->buf_size = 512 + 512;
     380                        socket->buf = malloc(socket->buf_size);
    347381#ifdef _DEBUG
    348                         memset(fp->psock->buf, 0, fp->psock->buf_size);
     382                        memset(socket->buf, 0, socket->buf_size);
    349383#endif
    350                         T_TCP_CCEP ccep = { 0, fp->psock->buf, 512, &fp->psock->buf[512], 512, (FP)socket_tcp_callback };
     384                        T_TCP_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp_callback };
    351385                        ret = tcp_cre_cep(cepid, &ccep);
    352386                        if (ret != E_OK) {
     
    355389                        }
    356390                        fp->handle = cepid;
    357                         fp->psock->cepid = cepid;
     391                        socket->cepid = cepid;
    358392                }
    359393                else {
    360                         cepid = lfp->psock->cepid;
     394                        cepid = ((socket_t *)lfp->exinf)->cepid;
    361395                        fp->handle = cepid;
    362                         lfp->handle = tmax_tcp_cepid + lfp->psock->repid;
    363                         lfp->psock->cepid = 0;
    364                         lfp->psock->buf_size = 0;
    365                         lfp->psock->buf = 0;
     396                        lfp->handle = tmax_tcp_cepid + ((socket_t *)lfp->exinf)->repid;
     397                        ((socket_t *)lfp->exinf)->cepid = 0;
     398                        ((socket_t *)lfp->exinf)->buf_size = 0;
     399                        ((socket_t *)lfp->exinf)->buf = 0;
    366400                }
    367401                T_IPV4EP rep = { 0, 0 };
    368                 ret = tcp_acp_cep(fp->psock->cepid, fp->psock->repid, &rep, TMO_FEVR);
     402                ret = tcp_acp_cep(socket->cepid, socket->repid, &rep, TMO_FEVR);
    369403                if (ret < 0) {
    370404                        return -ENOMEM;
    371405                }
    372                 struct sockaddr_in *raddr = &fp->psock->raddr4;
     406                struct sockaddr_in *raddr = &socket->raddr4;
    373407                memset(raddr, 0, sizeof(*raddr));
    374408                raddr->sin_family = AF_INET;
     
    387421                        return -EINVAL;
    388422                }
    389                 struct sockaddr_in *raddr = &fp->psock->raddr4;
     423                struct sockaddr_in *raddr = &socket->raddr4;
    390424                if (sz > sizeof(*raddr))
    391425                        sz = sizeof(*raddr);
     
    405439
    406440        int ret = 0;
    407         switch (fp->psock->family) {
     441        socket_t *socket = (socket_t *)fp->exinf;
     442        switch (socket->family) {
    408443        case AF_INET: {
    409                 switch (fp->psock->type) {
     444                switch (socket->type) {
    410445                case SOCK_STREAM: {
    411446                        if ((addr != NULL) || (alen != 0)) {
     
    414449
    415450                        if (flags & MSG_OOB) {
    416                                 ret = tcp_snd_oob(fp->psock->cepid, (void *)buf, len, SOCKET_TIMEOUT);
     451                                ret = tcp_snd_oob(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT);
    417452                                if (ret < 0) {
    418453                                        return -ECOMM;
     
    421456                        else {
    422457                                for (;;) {
    423                                         ret = tcp_snd_dat(fp->psock->cepid, (void *)buf, len, SOCKET_TIMEOUT);
     458                                        ret = tcp_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT);
    424459                                        if (ret < 0) {
    425460                                                if (ret == E_TMOUT)
     
    440475                                return -EINVAL;
    441476                        }
    442                         struct sockaddr_in *raddr = &fp->psock->raddr4;
     477                        struct sockaddr_in *raddr = &socket->raddr4;
    443478                        memset(raddr, 0, sizeof(*raddr));
    444479                        memcpy(raddr, addr, sz);
    445480                        T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) };
    446                         ret = udp_snd_dat(fp->psock->cepid, &rep, (void *)buf, len,
    447                                 (fp->psock->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
     481                        ret = udp_snd_dat(socket->cepid, &rep, (void *)buf, len,
     482                                (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
    448483                        if (ret < 0) {
    449484                                return (ret == E_TMOUT) ? -ETIME : -ECOMM;
     
    476511
    477512        int ret = 0;
    478         switch (fp->psock->family) {
     513        socket_t *socket = (socket_t *)fp->exinf;
     514        switch (socket->family) {
    479515        case AF_INET: {
    480                 switch (fp->psock->type) {
     516                switch (socket->type) {
    481517                case SOCK_STREAM: {
    482518                        if (flags & MSG_OOB) {
    483                                 ret = tcp_rcv_oob(fp->psock->cepid, buf, len);
     519                                ret = tcp_rcv_oob(socket->cepid, buf, len);
    484520                                if (ret < 0) {
    485521                                        syslog(LOG_ERROR, "tcp_rcv_oob => %d", ret);
     
    489525                        else {
    490526                                int rsz, tmp;
    491                                 if (fp->psock->input == NULL) {
     527                                if (socket->input == NULL) {
    492528                                        ret = wai_sem(SEM_FILEDESC);
    493529                                        if (ret < 0) {
    494530                                                syslog(LOG_ERROR, "wai_sem => %d", ret);
    495531                                        }
    496                                         fp->psock->len = 0;
     532                                        socket->len = 0;
    497533                                        ret = sig_sem(SEM_FILEDESC);
    498534                                        if (ret < 0) {
    499535                                                syslog(LOG_ERROR, "sig_sem => %d", ret);
    500536                                        }
    501                                         ret = tcp_rcv_buf(fp->psock->cepid, &fp->psock->input, TMO_FEVR);
     537                                        ret = tcp_rcv_buf(socket->cepid, &socket->input, TMO_FEVR);
    502538                                        if (ret < 0) {
    503539                                                syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret);
     
    507543                                }
    508544                                else
    509                                         rsz = fp->psock->len;
     545                                        rsz = socket->len;
    510546                                tmp = rsz;
    511547                                if (rsz > len)
    512548                                        rsz = len;
    513549                                if (rsz >= 0) {
    514                                         memcpy(buf, fp->psock->input, rsz);
     550                                        memcpy(buf, socket->input, rsz);
    515551                                        ret = wai_sem(SEM_FILEDESC);
    516552                                        if (ret < 0) {
    517553                                                syslog(LOG_ERROR, "wai_sem => %d", ret);
    518554                                        }
    519                                         fp->psock->len = tmp - rsz;
     555                                        socket->len = tmp - rsz;
    520556                                        ret = sig_sem(SEM_FILEDESC);
    521557                                        if (ret < 0) {
     
    523559                                        }
    524560                                        if (tmp - rsz == 0) {
    525                                                 fp->psock->input = NULL;
     561                                                socket->input = NULL;
    526562                                        }
    527563                                        else
    528                                                 fp->psock->input = (void *)&((uint8_t *)fp->psock->input)[rsz];
    529                                         ret = tcp_rel_buf(fp->psock->cepid, rsz);
     564                                                socket->input = (void *)&((uint8_t *)socket->input)[rsz];
     565                                        ret = tcp_rel_buf(socket->cepid, rsz);
    530566                                        if ((ret != E_OBJ) && (ret < 0)) {
    531567                                                syslog(LOG_ERROR, "tcp_rel_buf => %d", ret);
     
    538574                }
    539575                case SOCK_DGRAM: {
    540                         struct sockaddr_in *raddr = &fp->psock->raddr4;
     576                        struct sockaddr_in *raddr = &socket->raddr4;
    541577                        int rsz;
    542578                        ret = wai_sem(SEM_FILEDESC);
     
    544580                                syslog(LOG_ERROR, "wai_sem => %d", ret);
    545581                        }
    546                         T_NET_BUF *input = fp->psock->input;
     582                        T_NET_BUF *input = socket->input;
    547583                        if (input == NULL) {
    548584                                ret = sig_sem(SEM_FILEDESC);
     
    552588
    553589                                T_IPV4EP rep = { 0, 0 };
    554                                 ret = udp_rcv_dat(fp->psock->cepid, &rep, buf, len,
    555                                         (fp->psock->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
     590                                ret = udp_rcv_dat(socket->cepid, &rep, buf, len,
     591                                        (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
    556592                                if (ret < 0) {
    557                                         syslog(LOG_ERROR, "udp_rcv_buf => %d", ret);
     593                                        if ((socket->flags & O_NONBLOCK) == 0)
     594                                                syslog(LOG_ERROR, "udp_rcv_buf => %d", ret);
    558595                                        return (ret == E_TMOUT) ? -ETIME : -ECOMM;
    559596                                }
     
    565602                                        }
    566603                                        int sz = *alen;
    567                                         memset(raddr, 0, sizeof(fp->psock->raddr4));
     604                                        memset(raddr, 0, sizeof(socket->raddr4));
    568605                                        raddr->sin_family = AF_INET;
    569606                                        raddr->sin_port = htons(rep.portno);
    570607                                        raddr->sin_addr.s_addr = htonl(rep.ipaddr);
    571                                         if (sz > sizeof(fp->psock->raddr4))
    572                                                 sz = sizeof(fp->psock->raddr4);
     608                                        if (sz > sizeof(socket->raddr4))
     609                                                sz = sizeof(socket->raddr4);
    573610                                        memcpy(addr, raddr, sz);
    574611                                        *alen = sz;
     
    580617                        }
    581618                        else {
    582                                 rsz = fp->psock->len;
    583                                 void *pbuf = fp->psock->buf;
    584                                 fp->psock->input = NULL;
    585                                 fp->psock->len = 0;
    586                                 fp->psock->buf = NULL;
     619                                rsz = socket->len;
     620                                void *pbuf = socket->buf;
     621                                socket->input = NULL;
     622                                socket->len = 0;
     623                                socket->buf = NULL;
    587624                                if ((addr != NULL) && (alen != NULL)) {
    588625                                        int sz = *alen;
    589                                         if (sz > sizeof(fp->psock->raddr4))
    590                                                 sz = sizeof(fp->psock->raddr4);
     626                                        if (sz > sizeof(socket->raddr4))
     627                                                sz = sizeof(socket->raddr4);
    591628                                        memcpy(addr, raddr, sz);
    592629                                        *alen = sz;
     
    632669
    633670        ER ret;
    634         switch (fp->psock->family) {
     671        socket_t *socket = (socket_t *)fp->exinf;
     672        switch (socket->family) {
    635673        case AF_INET: {
    636                 switch (fp->psock->type) {
     674                switch (socket->type) {
    637675                case SOCK_STREAM: {
    638                         ret = tcp_sht_cep(fp->psock->cepid);
     676                        ret = tcp_sht_cep(socket->cepid);
    639677                        if (ret < 0) {
    640678                                return -ECOMM;
     
    661699
    662700        ER ret;
    663         switch (fp->psock->family) {
     701        socket_t *socket = (socket_t *)fp->exinf;
     702        switch (socket->family) {
    664703        case AF_INET: {
    665                 switch (fp->psock->type) {
     704                switch (socket->type) {
    666705                case SOCK_STREAM: {
    667706                        switch (level) {
     
    669708                                switch (optname) {
    670709                                case SO_REUSEADDR:
    671                                         if (fp->psock->flags & SO_REUSEADDR) {
     710                                        if (socket->flags & SO_REUSEADDR) {
    672711                                                *(bool *)optval = true;
    673712                                        }
     
    677716                                        break;
    678717                                case SO_KEEPALIVE:
    679                                         if (fp->psock->flags & SO_KEEPALIVE) {
     718                                        if (socket->flags & SO_KEEPALIVE) {
    680719                                                *(bool *)optval = true;
    681720                                        }
     
    692731                                break;
    693732                        case IPPROTO_TCP:
    694                                 ret = tcp_get_opt(fp->psock->cepid, optname, (void *)optval, *optlen);
     733                                ret = tcp_get_opt(socket->cepid, optname, (void *)optval, *optlen);
    695734                                if (ret < 0) {
    696735                                        return -EINVAL;
     
    706745                        switch (level) {
    707746                        case IPPROTO_UDP:
    708                                 ret = udp_get_opt(fp->psock->cepid, optname, (void *)optval, *optlen);
     747                                ret = udp_get_opt(socket->cepid, optname, (void *)optval, *optlen);
    709748                                if (ret < 0) {
    710749                                        return -EINVAL;
     
    736775
    737776        ER ret;
    738         switch (fp->psock->family) {
     777        socket_t *socket = (socket_t *)fp->exinf;
     778        switch (socket->family) {
    739779        case AF_INET: {
    740                 switch (fp->psock->type) {
     780                switch (socket->type) {
    741781                case SOCK_STREAM: {
    742782                        switch (level){
     
    745785                                case SO_REUSEADDR:
    746786                                        if (*(bool *)optval) {
    747                                                 fp->psock->flags |= SO_REUSEADDR;
     787                                                socket->flags |= SO_REUSEADDR;
    748788                                        }
    749789                                        else {
    750                                                 fp->psock->flags &= ~SO_REUSEADDR;
     790                                                socket->flags &= ~SO_REUSEADDR;
    751791                                        }
    752792                                        break;
    753793                                case SO_KEEPALIVE:
    754794                                        if (*(bool *)optval) {
    755                                                 fp->psock->flags |= SO_KEEPALIVE;
     795                                                socket->flags |= SO_KEEPALIVE;
    756796                                        }
    757797                                        else {
    758                                                 fp->psock->flags &= ~SO_KEEPALIVE;
     798                                                socket->flags &= ~SO_KEEPALIVE;
    759799                                        }
    760800                                        break;
     
    764804                                break;
    765805                        case IPPROTO_TCP:
    766                                 ret = tcp_set_opt(fp->psock->cepid, optname, (void *)optval, optlen);
     806                                ret = tcp_set_opt(socket->cepid, optname, (void *)optval, optlen);
    767807                                if (ret < 0) {
    768808                                        return -EINVAL;
     
    777817                        switch (level){
    778818                        case IPPROTO_UDP:
    779                                 ret = udp_set_opt(fp->psock->cepid, optname, (void *)optval, optlen);
     819                                ret = udp_set_opt(socket->cepid, optname, (void *)optval, optlen);
    780820                                if (ret < 0) {
    781821                                        return -EINVAL;
     
    809849
    810850        socklen_t size = *len;
    811         switch (fp->psock->family) {
     851        socket_t *socket = (socket_t *)fp->exinf;
     852        switch (socket->family) {
    812853        case AF_INET: {
    813                 struct sockaddr_in *raddr = &fp->psock->raddr4;
     854                struct sockaddr_in *raddr = &socket->raddr4;
    814855                *len = sizeof(struct sockaddr_in);
    815856                if (size > sizeof(struct sockaddr_in))
     
    837878
    838879        socklen_t size = *len;
    839         switch (fp->psock->family) {
     880        socket_t *socket = (socket_t *)fp->exinf;
     881        switch (socket->family) {
    840882        case AF_INET: {
    841883                const T_IN4_ADDR *laddr4 = in4_get_ifaddr(0);
     
    843885                laddr.sin_family = AF_INET;
    844886                laddr.sin_addr.s_addr = htonl(*laddr4);
    845                 laddr.sin_port = fp->psock->laddr4.sin_port;
     887                laddr.sin_port = socket->laddr4.sin_port;
    846888                memset(&laddr.sin_zero, 0, sizeof(laddr.sin_zero));
    847889                *len = sizeof(struct sockaddr_in);
     
    859901}
    860902
    861 int tcp_fd_close(struct _IO_FILE *fp)
     903int tcp_fd_close(struct SHELL_FILE *fp)
    862904{
    863905        ER ret, ret2;
    864906
    865         switch (fp->psock->family) {
     907        socket_t *socket = (socket_t *)fp->exinf;
     908        switch (socket->family) {
    866909        case AF_INET: {
    867                 if (fp->psock->cepid != 0) {
    868                         ID cepid = fp->psock->cepid;
     910                if (socket->cepid != 0) {
     911                        ID cepid = socket->cepid;
    869912                        ret = tcp_sht_cep(cepid);
    870913                        if (ret < 0) {
    871914                                //return -1;
    872915                        }
    873                         ret = tcp_cls_cep(cepid, (fp->psock->repid != 0) ? 0 : SOCKET_TIMEOUT);
     916                        ret = tcp_cls_cep(cepid, (socket->repid != 0) ? 0 : SOCKET_TIMEOUT);
    874917                        ret2 = tcp_del_cep(cepid);
    875                         free(fp->psock->buf);
    876                         fp->psock->buf = NULL;
    877                         delete_tcp_fd(cepid);
     918                        //delete_fd_by_id(&IO_TYPE_TCP, cepid);
    878919                        delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid);
    879920                        if ((ret < 0) || (ret2 < 0)) {
     
    881922                        }
    882923                }
    883                 else if (fp->psock->repid != 0) {
    884                         ID repid = fp->psock->repid;
     924                else if (socket->repid != 0) {
     925                        ID repid = socket->repid;
    885926                        ret = tcp_del_rep(repid);
    886                         free(fp->psock->buf);
    887                         fp->psock->buf = NULL;
    888                         delete_tcp_fd(tmax_tcp_cepid + repid);
     927                        //delete_fd_by_id(&IO_TYPE_TCP, tmax_tcp_cepid + repid);
    889928                        delete_id(tcp_repid_table, tcp_repid_table_count, repid);
    890929                        if (ret < 0) {
     
    893932                }
    894933                else {
    895                         free(fp->psock->buf);
    896                         fp->psock->buf = NULL;
    897934                        return -EINVAL;
    898935                }
     
    907944}
    908945
    909 size_t tcp_fd_read(struct _IO_FILE *fp, unsigned char *dst, size_t dstsz)
     946size_t tcp_fd_read(struct SHELL_FILE *fp, unsigned char *dst, size_t dstsz)
    910947{
    911948        return shell_recvfrom(fp->fd, dst, dstsz, 0, NULL, NULL);
    912949}
    913950
    914 size_t tcp_fd_write(struct _IO_FILE *fp, const unsigned char *src, size_t srcsz)
     951size_t tcp_fd_write(struct SHELL_FILE *fp, const unsigned char *src, size_t srcsz)
    915952{
    916953        return shell_sendto(fp->fd, src, srcsz, 0, NULL, 0);
    917954}
    918955
    919 off_t tcp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org)
     956off_t tcp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org)
    920957{
    921958        return -EPERM;
    922959}
    923960
    924 int tcp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg)
     961int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg)
    925962{
    926963        return -EINVAL;
    927964}
    928965
    929 int udp_fd_close(struct _IO_FILE *fp)
     966bool_t tcp_fd_readable(struct SHELL_FILE *fp)
     967{
     968        ER ret;
     969
     970        socket_t *socket = (socket_t *)fp->exinf;
     971        if (socket->cepid != 0) {
     972                if (socket->len == 0) {
     973                        ret = tcp_rcv_buf(socket->cepid, &socket->input, TMO_NBLK);
     974                        if ((ret != E_WBLK) && (ret != E_OBJ) && (ret < 0)) {
     975                                syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret);
     976                                //return ret;
     977                        }
     978                        if (ret > 0) {
     979                                ret = wai_sem(SEM_FILEDESC);
     980                                if (ret < 0) {
     981                                        syslog(LOG_ERROR, "wai_sem => %d", ret);
     982                                }
     983                                socket->len += ret;
     984                                ret = sig_sem(SEM_FILEDESC);
     985                                if (ret < 0) {
     986                                        syslog(LOG_ERROR, "sig_sem => %d", ret);
     987                                }
     988                        }
     989                }
     990                else ret = 1;
     991                if (ret > 0) {
     992                        return true;
     993                }
     994        }
     995
     996        return false;
     997}
     998
     999void tcp_fd_delete(struct SHELL_FILE *fp)
     1000{
     1001        socket_t *socket = (socket_t *)fp->exinf;
     1002        free(socket->buf);
     1003        socket->buf = NULL;
     1004        free(fp->exinf);
     1005        fp->exinf = NULL;
     1006}
     1007
     1008ER socket_tcp_callback(ID cepid, FN fncd, void *p_parblk)
     1009{
     1010        struct SHELL_FILE *fp = id_to_fd(&IO_TYPE_TCP, cepid);
     1011        FLGPTN flgptn = 0;
     1012        ER ret;
     1013        int len;
     1014
     1015        if (fp == NULL)
     1016                return E_PAR;
     1017
     1018        int fd = fp->fd;
     1019        FD_SET(fd, (fd_set *)&flgptn);
     1020
     1021        switch (fncd) {
     1022        case TFN_TCP_RCV_BUF:
     1023                len = *(int *)p_parblk;
     1024                if ((len <= 0) || (fp->exinf == NULL))
     1025                        return E_OK;
     1026
     1027                ret = wai_sem(SEM_FILEDESC);
     1028                if (ret < 0) {
     1029                        syslog(LOG_ERROR, "wai_sem => %d", ret);
     1030                }
     1031                socket_t *socket = (socket_t *)fp->exinf;
     1032                socket->len += len;
     1033                ret = sig_sem(SEM_FILEDESC);
     1034                if (ret < 0) {
     1035                        syslog(LOG_ERROR, "sig_sem => %d", ret);
     1036                }
     1037
     1038                if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
     1039
     1040                set_flg(FLG_SELECT_WAIT, flgptn);
     1041                return E_OK;
     1042
     1043        case TFN_TCP_RCV_DAT:
     1044                len = *(int *)p_parblk;
     1045                if ((len <= 0) || (fp->exinf == NULL))
     1046                        return E_OK;
     1047
     1048                ret = wai_sem(SEM_FILEDESC);
     1049                if (ret < 0) {
     1050                        syslog(LOG_ERROR, "wai_sem => %d", ret);
     1051                }
     1052                socket->len += len;
     1053                ret = sig_sem(SEM_FILEDESC);
     1054                if (ret < 0) {
     1055                        syslog(LOG_ERROR, "sig_sem => %d", ret);
     1056                }
     1057
     1058                if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
     1059
     1060                set_flg(FLG_SELECT_WAIT, flgptn);
     1061                return E_OK;
     1062
     1063        case TFN_TCP_SND_DAT:
     1064                if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
     1065
     1066                set_flg(FLG_SELECT_WAIT, flgptn);
     1067                return E_OK;
     1068
     1069        case TFN_TCP_CAN_CEP:
     1070                if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++;
     1071
     1072                set_flg(FLG_SELECT_WAIT, flgptn);
     1073                return E_OK;
     1074
     1075        case TFN_TCP_DEL_REP:
     1076                delete_fd_by_id(&IO_TYPE_TCP, tmax_tcp_cepid + cepid);
     1077                return E_OK;
     1078
     1079        case TFN_TCP_DEL_CEP:
     1080                delete_fd_by_id(&IO_TYPE_TCP, cepid);
     1081                return E_OK;
     1082
     1083        default:
     1084                return E_OK;
     1085        }
     1086}
     1087
     1088int udp_fd_close(struct SHELL_FILE *fp)
    9301089{
    9311090        ER ret;
    9321091        ID cepid;
    9331092
    934         switch (fp->psock->family) {
     1093        socket_t *socket = (socket_t *)fp->exinf;
     1094        switch (socket->family) {
    9351095        case AF_INET: {
    936                 cepid = fp->psock->cepid;
     1096                cepid = socket->cepid;
    9371097                ret = udp_del_cep(cepid);
    938                 //free(fp->psock->buf);
    939                 //fp->psock->buf = NULL;
    940                 delete_udp_fd(cepid);
     1098                //delete_fd_by_id(&IO_TYPE_UDP, cepid);
    9411099                delete_id(udp_cepid_table, udp_cepid_table_count, cepid);
    9421100                if (ret < 0) {
     
    9531111}
    9541112
    955 size_t udp_fd_read(struct _IO_FILE *fp, unsigned char *dst, size_t dstsz)
     1113size_t udp_fd_read(struct SHELL_FILE *fp, unsigned char *dst, size_t dstsz)
    9561114{
    9571115        return shell_recvfrom(fp->fd, dst, dstsz, 0, NULL, NULL);
    9581116}
    9591117
    960 size_t udp_fd_write(struct _IO_FILE *fp, const unsigned char *src, size_t srcsz)
     1118size_t udp_fd_write(struct SHELL_FILE *fp, const unsigned char *src, size_t srcsz)
    9611119{
    9621120        return shell_sendto(fp->fd, src, srcsz, 0, NULL, 0);
    9631121}
    9641122
    965 off_t udp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org)
     1123off_t udp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org)
    9661124{
    9671125        return -EPERM;
    9681126}
    9691127
    970 int udp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg)
     1128int udp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg)
    9711129{
    9721130        return -EINVAL;
     1131}
     1132
     1133bool_t udp_fd_readable(struct SHELL_FILE *fp)
     1134{
     1135        socket_t *socket = (socket_t *)fp->exinf;
     1136        if (socket->cepid != 0) {
     1137                if (socket->input != NULL) {
     1138                        return true;
     1139                }
     1140        }
     1141
     1142        return false;
     1143}
     1144
     1145void udp_fd_delete(struct SHELL_FILE *fp)
     1146{
     1147        //socket_t *socket = (socket_t *)fp->exinf;
     1148        //free(socket->buf);
     1149        //socket->buf = NULL;
     1150        free(fp->exinf);
     1151        fp->exinf = NULL;
     1152}
     1153
     1154ER socket_udp_callback(ID cepid, FN fncd, void *p_parblk)
     1155{
     1156        struct SHELL_FILE *fp = id_to_fd(&IO_TYPE_UDP, cepid);
     1157        FLGPTN flgptn = 0;
     1158        int len;
     1159
     1160        if (fp == NULL)
     1161                return E_PAR;
     1162
     1163        int fd = fp->fd;
     1164        FD_SET(fd, (fd_set *)&flgptn);
     1165
     1166        switch (fncd) {
     1167        case TEV_UDP_RCV_DAT:
     1168        {
     1169                T_UDP_RCV_DAT_PARA *udppara = (T_UDP_RCV_DAT_PARA *)p_parblk;
     1170                len = udppara->len;
     1171                if ((len <= 0) || (fp->exinf == NULL))
     1172                        return E_OK;
     1173
     1174                ER ret = wai_sem(SEM_FILEDESC);
     1175                if (ret < 0) {
     1176                        syslog(LOG_ERROR, "wai_sem => %d", ret);
     1177                }
     1178                socket_t *socket = (socket_t *)fp->exinf;
     1179                socket->len = len;
     1180                if (socket->input != NULL) {
     1181                        ret = rel_net_buf(socket->input);
     1182                        if (ret < 0) {
     1183                                syslog(LOG_ERROR, "rel_net_buf => %d", ret);
     1184                        }
     1185                }
     1186                socket->input = udppara->input;
     1187                socket->buf = GET_UDP_SDU(udppara->input, udppara->off);
     1188                memset(&socket->raddr4, 0, sizeof(socket->raddr4));
     1189                socket->raddr4.sin_family = AF_INET;
     1190                socket->raddr4.sin_port = htons(udppara->rep4.portno);
     1191                socket->raddr4.sin_addr.s_addr = htonl(udppara->rep4.ipaddr);
     1192                udppara->input->flags |= NB_FLG_NOREL_IFOUT;
     1193                ret = sig_sem(SEM_FILEDESC);
     1194                if (ret < 0) {
     1195                        syslog(LOG_ERROR, "sig_sem => %d", ret);
     1196                }
     1197
     1198                if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
     1199
     1200                set_flg(FLG_SELECT_WAIT, flgptn);
     1201                return E_OK;
     1202        }
     1203        case TFN_UDP_CRE_CEP:
     1204                return E_OK;
     1205
     1206        case TFN_UDP_RCV_DAT:
     1207                len = *(int *)p_parblk;
     1208                if ((len <= 0) || (fp->exinf == NULL))
     1209                        return E_OK;
     1210
     1211                if (fp->readevt_w == fp->readevt_r) fp->readevt_w++;
     1212
     1213                set_flg(FLG_SELECT_WAIT, flgptn);
     1214                return E_OK;
     1215
     1216        case TFN_UDP_SND_DAT:
     1217                if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
     1218
     1219                set_flg(FLG_SELECT_WAIT, flgptn);
     1220                return E_OK;
     1221
     1222        case TFN_UDP_CAN_CEP:
     1223                if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++;
     1224
     1225                set_flg(FLG_SELECT_WAIT, flgptn);
     1226                return E_OK;
     1227
     1228        case TFN_UDP_DEL_CEP:
     1229                delete_fd_by_id(&IO_TYPE_UDP, cepid);
     1230                return E_OK;
     1231
     1232        default:
     1233                return E_OK;
     1234        }
    9731235}
    9741236
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/socket_stub.h

    r364 r374  
    103103} socket_t;
    104104
    105 struct _IO_DIR {
    106         DIR dir;
     105struct SHELL_DIR {
     106        FATFS_DIR dir;
    107107        struct dirent dirent;
    108108};
    109109
    110 struct _IO_FILE {
     110typedef const struct io_type_s IO_TYPE;
     111
     112struct SHELL_FILE {
    111113        int fd;
    112         int type;
     114        IO_TYPE *type;
    113115        int handle;
    114         int (*close)(struct _IO_FILE *);
    115         size_t (*read)(struct _IO_FILE *, unsigned char *, size_t);
    116         size_t (*write)(struct _IO_FILE *, const unsigned char *, size_t);
    117         off_t (*seek)(struct _IO_FILE *, off_t, int);
    118         int (*ioctl)(struct _IO_FILE *, int, void *);
    119116        int readevt_r;
    120117        int readevt_w;
     
    124121        int errorevt_r;
    125122        int errorevt_w;
    126         union {
    127                 FIL *pfile;
    128                 struct _IO_DIR *pdir;
    129                 socket_t *psock;
    130         };
     123        void *exinf;
     124};
     125
     126struct io_type_s {
     127        int (*close)(struct SHELL_FILE *);
     128        size_t (*read)(struct SHELL_FILE *, unsigned char *, size_t);
     129        size_t (*write)(struct SHELL_FILE *, const unsigned char *, size_t);
     130        off_t (*seek)(struct SHELL_FILE *, off_t, int);
     131        int (*ioctl)(struct SHELL_FILE *, int, void *);
     132        bool_t (*readable)(struct SHELL_FILE *);
     133        void (*delete)(struct SHELL_FILE *);
    131134};
    132135
     
    141144#endif
    142145
    143 extern int stdio_close(struct _IO_FILE *fp);
    144 extern size_t stdio_read(struct _IO_FILE *fp, unsigned char *data, size_t len);
    145 extern size_t stdio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len);
    146 extern size_t stdin_read(struct _IO_FILE *fp, unsigned char *data, size_t len);
    147 extern size_t stdout_write(struct _IO_FILE *fp, const unsigned char *data, size_t len);
    148 extern size_t stderr_write(struct _IO_FILE *fp, const unsigned char *data, size_t len);
     146struct SHELL_FILE *new_fp(IO_TYPE *type, int id, int writable);
     147int delete_fd_by_id(IO_TYPE *type, int id);
     148struct SHELL_FILE *fd_to_fp(int fd);
     149struct SHELL_FILE *id_to_fd(IO_TYPE *type, int id);
    149150
    150 extern int sio_close(struct _IO_FILE *fp);
    151 extern size_t sio_read(struct _IO_FILE *fp, unsigned char *data, size_t len);
    152 extern size_t sio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len);
    153 extern off_t sio_seek(struct _IO_FILE *fp, off_t ofs, int org);
    154 extern int sio_ioctl(struct _IO_FILE *fp, int req, void *arg);
    155 
    156 extern int file_close(struct _IO_FILE *fp);
    157 extern size_t file_read(struct _IO_FILE *fp, unsigned char *data, size_t len);
    158 extern size_t file_write(struct _IO_FILE *fp, const unsigned char *data, size_t len);
    159 extern off_t file_seek(struct _IO_FILE *fp, off_t ofs, int org);
    160 extern int file_ioctl(struct _IO_FILE *fp, int req, void *arg);
    161 
    162 extern int dir_close(struct _IO_FILE *fp);
    163 extern size_t dir_read(struct _IO_FILE *fp, unsigned char *data, size_t len);
    164 extern size_t dir_write(struct _IO_FILE *fp, const unsigned char *data, size_t len);
    165 extern off_t dir_seek(struct _IO_FILE *fp, off_t ofs, int org);
    166 extern int dir_ioctl(struct _IO_FILE *fp, int req, void *arg);
    167 
    168 extern int tcp_fd_close(struct _IO_FILE *fp);
    169 extern size_t tcp_fd_read(struct _IO_FILE *fp, unsigned char *data, size_t len);
    170 extern size_t tcp_fd_write(struct _IO_FILE *fp, const unsigned char *data, size_t len);
    171 extern off_t tcp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org);
    172 extern int tcp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg);
    173 
    174 extern int udp_fd_close(struct _IO_FILE *fp);
    175 extern size_t udp_fd_read(struct _IO_FILE *fp, unsigned char *data, size_t len);
    176 extern size_t udp_fd_write(struct _IO_FILE *fp, const unsigned char *data, size_t len);
    177 extern off_t udp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org);
    178 extern int udp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg);
    179 
    180 struct _IO_FILE *fd_to_fp(int fd);
    181 
    182 struct _IO_FILE *new_sio_fd(int sioid);
    183 int delete_sio_fd(int sioid);
    184 struct _IO_FILE *sioid_to_fd(int sioid);
    185 
    186 struct _IO_FILE *new_file_fd(int fileid);
    187 int delete_file_fd(int fileid);
    188 struct _IO_FILE *fileid_to_fd(int fileid);
    189 
    190 struct _IO_FILE *new_dir_fd(int dirid);
    191 int delete_dir_fd(int dirid);
    192 struct _IO_FILE *dirid_to_fd(int dirid);
    193 
    194 struct _IO_FILE *new_tcp_fd(int tcpid);
    195 int delete_tcp_fd(int tcpid);
    196 struct _IO_FILE *tcpid_to_fd(int tcpid);
    197 
    198 struct _IO_FILE *new_udp_fd(int udpid);
    199 int delete_udp_fd(int udpid);
    200 struct _IO_FILE *udpid_to_fd(int udpid);
    201 
    202 int delete_fp(struct _IO_FILE *fp);
    203 int delete_tcp_rep(int repid);
     151int delete_fp(struct SHELL_FILE *fp);
    204152void clean_fd();
    205153
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/syscall.c

    r364 r374  
    4848
    4949        /* ==== Cleaning and invalidation of the L1 data cache ==== */
    50         __v7_all_cache(2);
     50        L1C_CleanInvalidateDCacheAll();
    5151        __DSB();
    5252
    5353        /* ==== Cleaning and invalidation of the L2 cache ==== */
    54         if (PL310->AUX_CNT & (1 << 16)) {
     54        if (L2C_310->AUX_CNT & (1 << 16)) {
    5555                assoc = 16;
    5656        }
     
    5858                assoc = 8;
    5959        }
    60         PL310->INV_WAY = (1 << assoc) - 1;
    61         while (PL310->INV_WAY & ((1 << assoc) - 1)); // poll invalidate
    62         PL310->CACHE_SYNC = 0x0;
     60        L2C_310->INV_WAY = (1 << assoc) - 1;
     61        while (L2C_310->INV_WAY & ((1 << assoc) - 1)); // poll invalidate
     62        L2C_310->CACHE_SYNC = 0x0;
    6363
    6464        /* ==== Invalidate all TLB entries ==== */
    65         __ca9u_inv_tlb_all();
     65        MMU_InvalidateTLB();
    6666
    6767        /* ==== Invalidate the L1 instruction cache ==== */
    68         __v7_inv_icache_all();
     68        L1C_InvalidateICacheAll();
    6969        __DSB();
    7070        __ISB();
     
    184184}
    185185
    186 long SYS_fdatasync() {
     186long SYS_fdatasync(long a) {
     187        //int fdatasync(int fd)
    187188        return no_implement("fdatasync\n");
    188189}
     
    200201}
    201202
    202 long SYS_futex() {
    203         int futex(int *uaddr, int op, int val, const struct timespec *timeout, int *uaddr2, int val3);
     203long SYS_futex(long a, long b, long c, long d, long e, long f) {
     204        //int futex(int *uaddr, int op, int val, const struct timespec *timeout, int *uaddr2, int val3);
    204205        return no_implement("futex\n");
    205206}
    206207
    207 long SYS_futimesat() {
     208long SYS_futimesat(long a, long b, long c) {
     209        //int futimesat(int dirfd, const char *pathname, const struct timeval times[2])
    208210        return no_implement("futimesat\n");
    209211}
     
    281283}
    282284
    283 long SYS_munmap() {
     285long SYS_munmap(long a, long b) {
     286        //int munmap(void *start, size_t len)
    284287        return no_implement("munmap\n");
    285288}
     
    293296}
    294297
    295 long SYS_pread64() {
     298long SYS_pread64(long a, long b, long c, long d) {
     299        //#define pread64 pread
     300        //ssize_t pread(int fd, void *buf, size_t size, off_t ofs)
    296301        return no_implement("pread64\n");
    297302}
    298303
    299 long SYS_pwrite64() {
     304long SYS_pwrite64(long a, long b, long c, long d) {
     305        //#define pwrite64 pwrite
     306        //ssize_t pwrite(int fd, const void *buf, size_t size, off_t ofs)
    300307        return no_implement("pwrite64\n");
    301308}
     
    337344}
    338345
    339 long SYS_rt_sigqueueinfo() {
     346long SYS_rt_sigqueueinfo(long a, long b, long c) {
     347        //int rt_sigqueueinfo(pid_t tgid, int sig, siginfo_t *uinfo)
    340348        return no_implement("rt_sigqueueinfo\n");
    341349}
     
    361369}
    362370
    363 long SYS_sched_setscheduler() {
     371long SYS_sched_setscheduler(long a, long b, long c) {
     372        //int sched_setscheduler(pid_t pid, int sched, const struct sched_param *param)
    364373        return no_implement("sched_setscheduler\n");
    365374}
    366375
    367 long SYS_set_robust_list() {
     376long SYS_set_robust_list(long a, long b) {
     377        //long set_robust_list(struct robust_list_head *head, size_t len)
    368378        return no_implement("set_robust_list\n");
    369379}
     
    401411}
    402412
    403 long SYS_utimensat() {
     413long SYS_utimensat(long a, long b, long c, long d) {
     414        //int utimensat(int fd, const char *path, const struct timespec times[2], int flags)
    404415        return no_implement("utimensat\n");
    405416}
    406417
    407 long SYS_utimes() {
     418long SYS_utimes(long a, long b) {
     419        //int utimes(const char *path, const struct timeval times[2])
    408420        return no_implement("utimes\n");
    409421}
     
    417429}
    418430
    419 long SYS_dup()
    420 {
     431long SYS_dup(long a) {
     432        //int dup(int fd)
    421433        return no_implement("dup\n");
    422434}
    423435
    424 long SYS_dup2()
    425 {
     436long SYS_dup2(long a, long b) {
     437        //int dup2(int old, int new)
    426438        return no_implement("dup2\n");
    427439}
    428440
    429 long SYS_pipe()
    430 {
     441long SYS_pipe(long a) {
     442        //int pipe(int fd[2])
    431443        return no_implement("pipe\n");
    432444}
    433445
    434 long SYS_readlink()
    435 {
     446long SYS_readlink(long a, long b, long c) {
     447        //ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize)
    436448        return no_implement("readlink\n");
    437449}
    438450
    439 long SYS_symlink()
    440 {
     451long SYS_symlink(long a, long b) {
     452        //int symlink(const char *existing, const char *new)
    441453        return no_implement("symlink\n");
    442454}
    443455
    444 long SYS_umask()
    445 {
     456long SYS_umask(long a) {
     457        //mode_t umask(mode_t mode)
    446458        return no_implement("umask\n");
    447459}
    448460
    449 long SYS_execve()
    450 {
     461long SYS_execve(long a, long b, long c) {
     462        //int execve(const char *path, char *const argv[], char *const envp[])
    451463        return no_implement("execve\n");
    452464}
    453465
    454 long SYS_fork()
    455 {
     466long SYS_fork() {
     467        //pid_t fork(void)
    456468        return no_implement("fork\n");
    457469}
    458470
    459 long SYS_wait4()
    460 {
     471long SYS_wait4(long a, long b, long c, long d) {
     472        //pid_t wait4(pid_t pid, int *status, int options, struct rusage *usage)
    461473        return no_implement("wait4\n");
    462474}
    463475
    464 long SYS_socketpair()
    465 {
     476long SYS_socketpair(long a, long b, long c, long d) {
     477        //int socketpair(int domain, int type, int protocol, int fd[2])
    466478        return no_implement("socketpair\n");
    467479}
    468480
    469 long SYS_flock()
    470 {
     481long SYS_flock(long a, long b) {
     482        //int flock(int fd, int op)
    471483        return no_implement("flock\n");
     484}
     485
     486long SYS_fchdir()
     487{
     488        return no_implement("fchdir\n");
     489}
     490
     491long SYS_getegid32()
     492{
     493        return no_implement("getegid32\n");
     494}
     495
     496long SYS_geteuid32()
     497{
     498        return no_implement("geteuid32\n");
     499}
     500
     501long SYS_getgid32()
     502{
     503        return no_implement("getgid32\n");
     504}
     505
     506long SYS_pipe2()
     507{
     508        return no_implement("pipe2\n");
     509}
     510
     511long SYS_setgid32()
     512{
     513        return no_implement("setgid32\n");
     514}
     515
     516long SYS_setpgid()
     517{
     518        return no_implement("setpgid\n");
     519}
     520
     521long SYS_setsid()
     522{
     523        return no_implement("setsid\n");
     524}
     525
     526long SYS_setuid32()
     527{
     528        return no_implement("setuid32\n");
     529}
     530
     531long SYS_tgkill()
     532{
     533        return no_implement("tgkill\n");
     534}
     535
     536long SYS_nanosleep(long a, long b) {
     537        //int nanosleep(const struct timespec *req, struct timespec *rem)
     538        return no_implement("nanosleep\n");
     539}
     540
     541long SYS_prlimit64(long a, long b, long c, long d) {
     542        //#define prlimit64 prlimit
     543        //int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit)
     544        return no_implement("prlimit64\n");
     545}
     546
     547long SYS_sched_getaffinity(long a, long b, long c) {
     548        //int sched_getaffinity(pid_t tid, size_t size, cpu_set_t *set)
     549        return no_implement("sched_getaffinity\n");
     550}
     551
     552long SYS_sysinfo(long a) {
     553        //int sysinfo(struct sysinfo *info)
     554        return no_implement("sysinfo\n");
     555}
     556
     557long SYS_ugetrlimit(long a, long b) {
     558        //#define SYS_getrlimit SYS_ugetrlimit
     559        //int getrlimit(int resource, struct rlimit *rlim)
     560        return no_implement("ugetrlimit\n");
    472561}
    473562
Note: See TracChangeset for help on using the changeset viewer.