Changeset 374 for asp3_tinet_ecnl_rx/trunk/ntshell/src
- Timestamp:
- Apr 5, 2019, 9:26:53 PM (5 years ago)
- Location:
- asp3_tinet_ecnl_rx/trunk/ntshell/src
- Files:
-
- 3 deleted
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_rx/trunk/ntshell/src/fdtable.c
r364 r374 68 68 #include "kernel_cfg.h" 69 69 #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 static int stdio_close(struct SHELL_FILE *fp); 74 static size_t stdio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len); 75 static size_t stdio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 76 static size_t stdin_read(struct SHELL_FILE *fp, unsigned char *data, size_t len); 77 static size_t stdout_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 78 static size_t stderr_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 79 static void stdio_delete(struct SHELL_FILE *fp); 80 81 static int sio_close(struct SHELL_FILE *fp); 82 static size_t sio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len); 83 static size_t sio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 84 static off_t sio_seek(struct SHELL_FILE *fp, off_t ofs, int org); 85 static int sio_ioctl(struct SHELL_FILE *fp, int req, void *arg); 86 static bool_t sio_readable(struct SHELL_FILE *fp); 87 static void sio_delete(struct SHELL_FILE *fp); 88 89 IO_TYPE IO_TYPE_STDIN = { stdio_close, stdin_read, stdio_write, sio_seek, sio_ioctl, sio_readable, stdio_delete }; 90 IO_TYPE IO_TYPE_STDOUT = { stdio_close, stdio_read, stdout_write, sio_seek, sio_ioctl, sio_readable, stdio_delete }; 91 IO_TYPE IO_TYPE_STDERR = { stdio_close, stdio_read, stderr_write, sio_seek, sio_ioctl, sio_readable, stdio_delete }; 92 IO_TYPE IO_TYPE_SIO = { sio_close, sio_read, sio_write, sio_seek, sio_ioctl, sio_readable, sio_delete }; 93 ntstdio_t ntstdio; 94 95 static struct SHELL_FILE fd_table[8 * sizeof(FLGPTN)] = { 96 { 0, &IO_TYPE_STDIN, 0, .exinf = &ntstdio }, 97 { 1, &IO_TYPE_STDOUT, 0, .exinf = &ntstdio }, 98 { 2, &IO_TYPE_STDERR, 0,.exinf = &ntstdio }, 82 99 }; 83 100 #define fd_table_count (sizeof(fd_table) / sizeof(fd_table[0])) 84 101 85 static int new_fd(int type, int id) 86 { 102 extern ntstdio_t ntstdio; 103 serial_t stdio_uart; 104 105 unsigned char ntstdio_xi(struct ntstdio_t *handle) 106 { 107 return serial_getc((serial_t *)handle->exinf); 108 } 109 110 void ntstdio_xo(struct ntstdio_t *handle, unsigned char c) 111 { 112 serial_putc((serial_t *)handle->exinf, c); 113 } 114 115 void sys_init(intptr_t exinf) 116 { 117 sys_tlsf_init(); 118 119 serial_init(&stdio_uart, STDIO_UART_TX, STDIO_UART_RX); 120 serial_baud(&stdio_uart, UART_BAUDRATE); 121 serial_format(&stdio_uart, 8, ParityNone, 1); 122 123 ntstdio_init(&ntstdio, NTSTDIO_OPTION_LINE_ECHO | NTSTDIO_OPTION_CANON | NTSTDIO_OPTION_LF_CRLF | NTSTDIO_OPTION_LF_CR, ntstdio_xi, ntstdio_xo); 124 ntstdio.exinf = (void *)&stdio_uart; 125 } 126 127 int stdio_close(struct SHELL_FILE *fp) 128 { 129 return -EPERM; 130 } 131 132 size_t stdio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len) 133 { 134 return -EPERM; 135 } 136 137 size_t stdio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len) 138 { 139 return -EPERM; 140 } 141 142 size_t stdin_read(struct SHELL_FILE *fp, unsigned char *data, size_t len) 143 { 144 int i = 0; 145 while (i < len) { 146 int c = ntstdio_getc((struct ntstdio_t *)fp->exinf); 147 data[i++] = c; 148 if ((c == EOF) || (c == '\n')) 149 break; 150 } 151 return i; 152 } 153 154 size_t stdout_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len) 155 { 156 for (int i = 0; i < len; i++) { 157 ntstdio_putc((struct ntstdio_t *)fp->exinf, data[i]); 158 } 159 return len; 160 } 161 162 size_t stderr_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len) 163 { 164 for (int i = 0; i < len; i++) { 165 ntstdio_putc((struct ntstdio_t *)fp->exinf, data[i]); 166 } 167 return len; 168 } 169 170 void stdio_delete(struct SHELL_FILE *fp) 171 { 172 } 173 174 int sio_close(struct SHELL_FILE *fp) 175 { 176 return -EPERM; 177 } 178 179 size_t sio_read(struct SHELL_FILE *fp, unsigned char *data, size_t len) 180 { 181 return -EPERM; 182 } 183 184 size_t sio_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len) 185 { 186 return -EPERM; 187 } 188 189 off_t sio_seek(struct SHELL_FILE *fp, off_t ofs, int org) 190 { 191 return -EPERM; 192 } 193 194 int sio_ioctl(struct SHELL_FILE *fp, int request, void *arg) 195 { 196 switch (request) { 197 case TIOCGWINSZ: 198 return 0; 199 case TCGETS: 200 return sio_tcgetattr(fp->fd, (struct termios *)arg); 201 case TCSETS + TCSANOW: 202 case TCSETS + TCSADRAIN: 203 case TCSETS + TCSAFLUSH: 204 return sio_tcsetattr(fp->fd, request - TCSETS, (const struct termios *)arg); 205 } 206 207 return -EINVAL; 208 } 209 210 bool_t sio_readable(struct SHELL_FILE *fp) 211 { 212 return fp->readevt_w != fp->readevt_r; 213 } 214 215 void sio_delete(struct SHELL_FILE *fp) 216 { 217 free((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf); 218 ((struct ntstdio_t *)fp->exinf)->exinf = NULL; 219 free((struct ntstdio_t *)fp->exinf); 220 fp->exinf = NULL; 221 } 222 223 struct SHELL_FILE *new_fp(IO_TYPE *type, int id, int writable) 224 { 225 struct SHELL_FILE *fp = NULL; 226 ER ret; 227 228 ret = wai_sem(SEM_FILEDESC); 229 if (ret < 0) { 230 syslog(LOG_ERROR, "wai_sem => %d", ret); 231 } 232 87 233 for (int fd = 3; fd < fd_table_count; fd++) { 88 struct _IO_FILE *fp = &fd_table[fd];89 if (fp->type != IO_TYPE_FREE)234 fp = &fd_table[fd]; 235 if (fp->type != NULL) 90 236 continue; 91 237 92 memset(fp, 0, sizeof(struct _IO_FILE));238 memset(fp, 0, sizeof(struct SHELL_FILE)); 93 239 fp->fd = fd; 94 240 fp->type = type; 95 241 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 { 242 fp->writable = writable; 243 break; 244 } 245 246 ret = sig_sem(SEM_FILEDESC); 247 if (ret < 0) { 248 syslog(LOG_ERROR, "sig_sem => %d", ret); 249 } 250 251 return fp; 252 } 253 254 struct SHELL_FILE *id_to_fd(IO_TYPE *type, int id) 255 { 256 struct SHELL_FILE *fp = NULL; 257 ER ret; 258 259 ret = wai_sem(SEM_FILEDESC); 260 if (ret < 0) { 261 syslog(LOG_ERROR, "wai_sem => %d", ret); 262 } 263 104 264 for (int fd = 3; fd < fd_table_count; fd++) { 105 struct _IO_FILE *fp = &fd_table[fd];265 fp = &fd_table[fd]; 106 266 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); 267 break; 268 } 269 270 ret = sig_sem(SEM_FILEDESC); 271 if (ret < 0) { 272 syslog(LOG_ERROR, "sig_sem => %d", ret); 273 } 274 275 return fp; 276 } 277 278 int delete_fd_by_id(IO_TYPE *type, int id) 279 { 280 struct SHELL_FILE *fp = id_to_fd(type, id); 116 281 if (fp == NULL) 117 282 return -EBADF; … … 120 285 } 121 286 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)); 287 int delete_fp(struct SHELL_FILE *fp) 288 { 289 ER ret; 290 291 fp->type->delete(fp); 292 293 ret = wai_sem(SEM_FILEDESC); 294 if (ret < 0) { 295 syslog(LOG_ERROR, "wai_sem => %d", ret); 296 } 297 298 memset(fp, 0, sizeof(struct SHELL_FILE)); 299 300 ret = sig_sem(SEM_FILEDESC); 301 if (ret < 0) { 302 syslog(LOG_ERROR, "sig_sem => %d", ret); 303 } 131 304 132 305 return 0; 133 306 } 134 307 135 struct _IO_FILE *fd_to_fp(int fd)308 struct SHELL_FILE *fd_to_fp(int fd) 136 309 { 137 310 if ((fd < 0) || (fd >= fd_table_count)) … … 140 313 } 141 314 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) 315 void memand(void *dst, void *src, size_t len) 289 316 { 290 317 uint8_t *d = (uint8_t *)dst; … … 293 320 294 321 while (s < e) { 295 *d++ |= *s++;322 *d++ &= *s++; 296 323 } 297 324 } … … 336 363 337 364 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));344 365 if (ret == E_OK) { 345 366 if (rfds != NULL) 346 mem or(rfds, &evts.readfds, sizeof(fd_set));367 memand(rfds, &evts.readfds, sizeof(fd_set)); 347 368 if (wfds != NULL) 348 mem or(wfds, &evts.writefds, sizeof(fd_set));369 memand(wfds, &evts.writefds, sizeof(fd_set)); 349 370 if (efds != NULL) 350 mem or(efds, &evts.errorfds, sizeof(fd_set));371 memand(efds, &evts.errorfds, sizeof(fd_set)); 351 372 return evts.count; 352 373 } 353 374 if (ret == E_TMOUT) { 375 if (rfds != NULL) 376 memset(rfds, 0, sizeof(fd_set)); 377 if (wfds != NULL) 378 memset(wfds, 0, sizeof(fd_set)); 379 if (efds != NULL) 380 memset(efds, 0, sizeof(fd_set)); 354 381 return 0; 355 382 } … … 419 446 { 420 447 int fd = STDIN_FILENO; 421 struct _IO_FILE *fp = &fd_table[fd]; 422 T_SERIAL_RPOR rpor; 448 struct SHELL_FILE *fp = &fd_table[fd]; 423 449 FLGPTN flgptn = 0; 424 450 425 ER ret = serial_ref_por(SIO_PORTID, &rpor); 426 if (ret != E_OK) 427 return; 428 429 if (rpor.reacnt != 0) { 451 if (serial_readable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) { 430 452 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 431 453 432 454 FD_SET(fd, (fd_set *)&flgptn); 433 455 } 434 if ( rpor.wricnt != 0) {456 if (serial_writable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) { 435 457 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++; 436 458 … … 447 469 { 448 470 int fd = STDIN_FILENO; 449 struct _IO_FILE *fp = &fd_table[fd]; 450 T_SERIAL_RPOR rpor; 471 struct SHELL_FILE *fp = &fd_table[fd]; 451 472 *flgptn = 0; 452 473 453 ER ret = serial_ref_por(SIO_PORTID, &rpor); 454 if (ret != E_OK) 455 return; 456 457 if (rpor.reacnt != 0) { 474 if (serial_readable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) { 458 475 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 459 476 460 477 FD_SET(fd, (fd_set *)flgptn); 461 478 } 462 if ( rpor.wricnt != 0) {479 if (serial_writable((serial_t *)((struct ntstdio_t *)fp->exinf)->exinf)) { 463 480 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++; 464 481 … … 466 483 } 467 484 } 468 469 #ifndef NTSHELL_NO_SOCKET470 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 #endif633 485 634 486 ER shell_get_evts(struct fd_events *evts, TMO tmout) … … 642 494 ER ret; 643 495 FLGPTN waitptn, flgptn, readfds = 0, writefds = 0; 644 struct _IO_FILE *fp = NULL;496 struct SHELL_FILE *fp = NULL; 645 497 646 498 stdio_update_evts(); … … 656 508 #ifndef NTSHELL_NO_SOCKET 657 509 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 } 510 if (fp->type->readable(fp)) { 511 FD_SET(fd, (fd_set *)&readfds); 512 count++; 513 if (fp->readevt_w == fp->readevt_r) fp->readevt_r--; 690 514 } 691 515 else { … … 786 610 void clean_fd() 787 611 { 788 struct _IO_FILE *fp = NULL;612 struct SHELL_FILE *fp = NULL; 789 613 for (int fd = 3; fd < fd_table_count; fd++) { 790 614 fp = &fd_table[fd]; … … 792 616 continue; 793 617 794 fp-> close(fp);618 fp->type->close(fp); 795 619 796 620 delete_fp(fp); … … 800 624 int shell_ioctl(int fd, int request, void *arg) 801 625 { 802 struct _IO_FILE *fp = fd_to_fp(fd);626 struct SHELL_FILE *fp = fd_to_fp(fd); 803 627 if (fp == NULL) 804 628 return -EBADF; 805 629 806 return fp-> ioctl(fp, request, arg);630 return fp->type->ioctl(fp, request, arg); 807 631 } 808 632 -
asp3_tinet_ecnl_rx/trunk/ntshell/src/io_stub.c
r337 r374 1 1 /* 2 2 * TOPPERS ECHONET Lite Communication Middleware 3 * 3 * 4 4 * Copyright (C) 2017 Cores Co., Ltd. Japan 5 * 5 * 6 6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 7 7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 … … 26 26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 27 27 * 免責すること. 28 * 28 * 29 29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 30 30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 … … 32 32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 33 33 * の責任を負わない. 34 * 34 * 35 35 * @(#) $Id$ 36 36 */ … … 43 43 #include <sil.h> 44 44 #include <string.h> 45 #include "syssvc/serial.h" 45 46 #include "syssvc/syslog.h" 46 47 #include "socket_stub.h" … … 49 50 #include "core/ntlibc.h" 50 51 #include "kernel_cfg.h" 52 #include "target_syssvc.h" 51 53 52 54 int fresult2errno(FRESULT res) … … 77 79 } 78 80 79 int shell_open(const char * path, int flags, void *arg) 80 { 81 FRESULT res; 82 struct _IO_FILE *fp; 81 static int file_close(struct SHELL_FILE *fp); 82 static size_t file_read(struct SHELL_FILE *fp, unsigned char *data, size_t len); 83 static size_t file_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 84 static off_t file_seek(struct SHELL_FILE *fp, off_t ofs, int org); 85 static int file_ioctl(struct SHELL_FILE *fp, int req, void *arg); 86 static bool_t file_readable(struct SHELL_FILE *fp); 87 static void file_delete(struct SHELL_FILE *fp); 88 89 static int dir_close(struct SHELL_FILE *fp); 90 static size_t dir_read(struct SHELL_FILE *fp, unsigned char *data, size_t len); 91 static size_t dir_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 92 static off_t dir_seek(struct SHELL_FILE *fp, off_t ofs, int org); 93 static int dir_ioctl(struct SHELL_FILE *fp, int req, void *arg); 94 static bool_t dir_readable(struct SHELL_FILE *fp); 95 static void dir_delete(struct SHELL_FILE *fp); 96 97 IO_TYPE IO_TYPE_FILE = { file_close, file_read, file_write, file_seek, file_ioctl, file_readable, file_delete }; 98 IO_TYPE IO_TYPE_DIR = { dir_close, dir_read, dir_write, dir_seek, dir_ioctl, dir_readable, dir_delete }; 99 100 int shell_open(const char *path, int flags, void *arg) 101 { 102 FRESULT res; 103 struct SHELL_FILE *fp; 83 104 84 105 if (flags & O_DIRECTORY) { 85 fp = new_ dir_fd(0);106 fp = new_fp(&IO_TYPE_DIR, 0, 0); 86 107 if (fp == NULL) 87 108 return -ENOMEM; 88 109 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; 90 114 FRESULT res; 91 115 if ((res = f_opendir(dir, path)) != FR_OK) { … … 95 119 } 96 120 97 fp = new_f ile_fd(0);121 fp = new_fp(&IO_TYPE_FILE, 0, 1); 98 122 if (fp == NULL) 99 123 return -ENOMEM; 124 125 fp->exinf = malloc(sizeof(FIL)); 126 memset(fp->exinf, 0, sizeof(FIL)); 100 127 101 128 BYTE fmd = 0; … … 133 160 } 134 161 135 if ((res = f_open( fp->pfile, path, fmd)) == FR_OK) {162 if ((res = f_open((FIL *)fp->exinf, path, fmd)) == FR_OK) { 136 163 fp->handle = fp->fd; 137 164 return fp->fd; … … 141 168 } 142 169 143 int file_close(struct _IO_FILE *fp)144 { 145 FRESULT res; 146 147 if ((res = f_close( fp->pfile)) == FR_OK) {170 int file_close(struct SHELL_FILE *fp) 171 { 172 FRESULT res; 173 174 if ((res = f_close((FIL *)fp->exinf)) == FR_OK) { 148 175 return 0; 149 176 } … … 152 179 } 153 180 154 size_t file_read(struct _IO_FILE *fp, unsigned char *data, size_t len)181 size_t file_read(struct SHELL_FILE *fp, unsigned char *data, size_t len) 155 182 { 156 183 unsigned int ret = 0; 157 184 FRESULT res; 158 185 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) 160 187 return -EIO; 161 188 … … 163 190 } 164 191 165 size_t file_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)192 size_t file_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len) 166 193 { 167 194 unsigned int ret = 0; 168 195 FRESULT res; 169 196 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) 171 198 return -EIO; 172 199 … … 174 201 } 175 202 176 off_t file_seek(struct _IO_FILE *fp, off_t ptr, int dir)203 off_t file_seek(struct SHELL_FILE *fp, off_t ptr, int dir) 177 204 { 178 205 switch (dir) { … … 191 218 192 219 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) 194 221 return -EIO; 195 222 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 226 int file_ioctl(struct SHELL_FILE *fp, int req, void *arg) 200 227 { 201 228 DRESULT res; 202 229 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)) 204 231 return -EINVAL; 205 232 … … 207 234 } 208 235 236 bool_t file_readable(struct SHELL_FILE *fp) 237 { 238 return fp->readevt_w != fp->readevt_r; 239 } 240 241 void file_delete(struct SHELL_FILE *fp) 242 { 243 free((FIL *)fp->exinf); 244 fp->exinf = NULL; 245 } 246 209 247 int shell_close(int fd) 210 248 { 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); 216 254 217 255 delete_fp(fp); … … 222 260 ssize_t shell_read(int fd, void *data, size_t len) 223 261 { 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); 229 267 } 230 268 … … 232 270 { 233 271 int result = 0; 234 struct _IO_FILE *fp = fd_to_fp(fd);272 struct SHELL_FILE *fp = fd_to_fp(fd); 235 273 if (fp == NULL) 236 274 return -EBADF; … … 238 276 const struct iovec *end = &iov[iovcnt]; 239 277 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); 241 279 } 242 280 … … 246 284 ssize_t shell_write(int fd, const void *data, size_t len) 247 285 { 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); 253 291 } 254 292 … … 256 294 { 257 295 int result = 0; 258 struct _IO_FILE *fp = fd_to_fp(fd);296 struct SHELL_FILE *fp = fd_to_fp(fd); 259 297 if (fp == NULL) 260 298 return -EBADF; … … 262 300 const struct iovec *end = &iov[iovcnt]; 263 301 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); 265 303 } 266 304 … … 270 308 int shell_llseek(int fd, off_t ptr, off_t *result, int dir) 271 309 { 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); 277 315 if (ret < 0) 278 316 return ret; … … 284 322 int shell_fstat(int fd, struct stat * st) 285 323 { 286 struct _IO_FILE *fp = fd_to_fp(fd);324 struct SHELL_FILE *fp = fd_to_fp(fd); 287 325 if (fp == NULL) 288 326 return -EBADF; … … 296 334 int shell_fsync(int fd) 297 335 { 298 struct _IO_FILE *fp = fd_to_fp(fd);336 struct SHELL_FILE *fp = fd_to_fp(fd); 299 337 if (fp == NULL) 300 338 return -EBADF; … … 304 342 int shell_ftruncate(int fd, off_t length) 305 343 { 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) 312 350 return fresult2errno(res); 313 351 … … 320 358 } 321 359 360 extern IO_TYPE IO_TYPE_SIO; 361 322 362 int sio_tcgetattr(int fd, struct termios *termios) 323 363 { 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 400 int 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; 331 411 } 332 412 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; 337 417 } 338 418 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; 343 423 } 344 424 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; 349 429 } 350 430 else { 351 termios->c_oflag &= ~ONLCR;431 ntstdio->option &= ~NTSTDIO_OPTION_LF_CRLF; 352 432 } 353 433 return 0; 354 434 } 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 390 436 shell_abort(); 391 437 return 0; … … 396 442 FILINFO fi; 397 443 FRESULT ret; 398 #if _USE_LFN399 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 */ 400 446 fi.lfname = lfn; 401 447 fi.lfsize = sizeof lfn; 402 448 #endif 403 449 if (strcmp(path, ".") == 0) { 404 char cwd[ _MAX_LFN];450 char cwd[FF_MAX_LFN]; 405 451 if ((ret = f_getcwd(cwd, sizeof(cwd))) != FR_OK) { 406 452 return fresult2errno(ret); … … 426 472 st->st_mtim.tv_nsec = 0; 427 473 st->st_mtim.tv_sec = fi.fdate + fi.ftime; 428 st->st_mode 474 st->st_mode = (S_IRUSR | S_IRGRP | S_IROTH); 429 475 st->st_mode |= (fi.fattrib & AM_RDO) ? 0 : (S_IWUSR | S_IWGRP | S_IWOTH); 430 476 st->st_mode |= (fi.fattrib & (AM_DIR | AM_VOL)) ? S_IFDIR : S_IFREG; … … 485 531 BYTE mask = AM_RDO | AM_SYS; // AM_ARC, AM_HID 486 532 487 if (mode & S_IREAD) {488 if ((mode & S_IWRITE) == 0) {533 if (mode & S_IREAD) { 534 if ((mode & S_IWRITE) == 0) { 489 535 attr |= AM_RDO; 490 536 } … … 494 540 } 495 541 496 if ((res = f_chmod(path, attr, mask)) != FR_OK) {542 if ((res = f_chmod(path, attr, mask)) != FR_OK) { 497 543 return fresult2errno(res); 498 544 } … … 507 553 BYTE mask = AM_RDO | AM_SYS; // AM_ARC, AM_HID 508 554 509 if (mode & S_IREAD) {510 if ((mode & S_IWRITE) == 0) {555 if (mode & S_IREAD) { 556 if ((mode & S_IWRITE) == 0) { 511 557 attr |= AM_RDO; 512 558 } … … 516 562 } 517 563 518 if ((res = f_chmod(path, attr, mask)) != FR_OK) {564 if ((res = f_chmod(path, attr, mask)) != FR_OK) { 519 565 return fresult2errno(res); 520 566 } … … 526 572 { 527 573 FRESULT ret; 528 if ((ret = f_getcwd(buf, size)) != FR_OK) {574 if ((ret = f_getcwd(buf, size)) != FR_OK) { 529 575 return NULL; 530 576 } … … 549 595 } 550 596 551 int dir_close(struct _IO_FILE *fp)552 { 553 FRESULT res; 554 if ((res = f_closedir(& fp->pdir->dir)) != FR_OK) {597 int dir_close(struct SHELL_FILE *fp) 598 { 599 FRESULT res; 600 if ((res = f_closedir(&((struct SHELL_DIR *)fp->exinf)->dir)) != FR_OK) { 555 601 return fresult2errno(res); 556 602 } … … 564 610 return -EINVAL; 565 611 566 struct _IO_FILE *fp = fd_to_fp(fd);612 struct SHELL_FILE *fp = fd_to_fp(fd); 567 613 if (fp == NULL) 568 614 return -EBADF; 569 615 570 616 FILINFO fno; 571 #if _USE_LFN572 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 */ 573 619 fno.lfname = lfn; 574 620 fno.lfsize = sizeof lfn; 575 621 #endif 576 622 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') { 578 624 return fresult2errno(res); 579 625 } 580 626 581 627 memset(de, 0, sizeof(*de)); 582 #if _USE_LFN628 #if FF_USE_LFN 583 629 ntlibc_strlcpy(de->d_name, *fno.lfname ? fno.lfname : fno.fname, sizeof(de->d_name)); 584 630 #else … … 589 635 } 590 636 591 size_t dir_read(struct _IO_FILE *fp, unsigned char *data, size_t len)637 size_t dir_read(struct SHELL_FILE *fp, unsigned char *data, size_t len) 592 638 { 593 639 return -EPERM; 594 640 } 595 641 596 size_t dir_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)642 size_t dir_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len) 597 643 { 598 644 return -EPERM; 599 645 } 600 646 601 off_t dir_seek(struct _IO_FILE *fp, off_t ptr, int dir)647 off_t dir_seek(struct SHELL_FILE *fp, off_t ptr, int dir) 602 648 { 603 649 FRESULT res; … … 607 653 608 654 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) { 610 656 return fresult2errno(res); 611 657 } … … 613 659 else { 614 660 FILINFO fno; 615 #if _USE_LFN616 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 */ 617 663 fno.lfname = lfn; 618 664 fno.lfsize = sizeof lfn; 619 665 #endif 620 if ((res = f_rewinddir(& fp->pdir->dir)) != FR_OK) {666 if ((res = f_rewinddir(&((struct SHELL_DIR *)fp->exinf)->dir)) != FR_OK) { 621 667 return fresult2errno(res); 622 668 } 623 669 624 670 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') { 626 672 return fresult2errno(res); 627 673 } … … 632 678 } 633 679 634 int dir_ioctl(struct _IO_FILE *fp, int req, void *arg)680 int dir_ioctl(struct SHELL_FILE *fp, int req, void *arg) 635 681 { 636 682 return -EINVAL; 683 } 684 685 bool_t dir_readable(struct SHELL_FILE *fp) 686 { 687 return fp->readevt_w != fp->readevt_r; 688 } 689 690 void dir_delete(struct SHELL_FILE *fp) 691 { 692 free((struct SHELL_DIR *)fp->exinf); 693 fp->exinf = NULL; 637 694 } 638 695 … … 687 744 { 688 745 //if ((addr >= (void *)&_HeapBase) && (addr + len < (void *)&_HeapLimit)) { 689 690 691 746 return 0; 747 //} 748 //return -1; 692 749 } 693 750 … … 697 754 static pool_t sys_pool; 698 755 699 void sys_ init(void)756 void sys_tlsf_init(void) 700 757 { 701 758 sys_tlsf = tlsf_create(&_HeapBase); -
asp3_tinet_ecnl_rx/trunk/ntshell/src/net_misc.c
r359 r374 60 60 #include "kernel_cfg.h" 61 61 #include "tinet_cfg.h" 62 #include "util/ntstdio.h" 63 64 extern ntstdio_t ntstdio; 62 #include <stdio.h> 65 63 66 64 T_DHCP4_CLI_CONTEXT *dhcp4_cli_initialize(ID tskid, ID cepid); … … 97 95 98 96 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); 100 98 101 99 /* 初期化 */ … … 105 103 ret = get_tim(&time); 106 104 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", 108 106 nc->cepid, time / SYSTIM_HZ, itron_strerror(ret)); 109 107 return; … … 119 117 error = tslp_tsk(timer); 120 118 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", 122 120 nc->cepid, itron_strerror(error), timer); 123 121 break; … … 126 124 ret = get_tim(&time); 127 125 if (ret != E_OK) { 128 ntstdio_printf(&ntstdio,"[NET MISC,%d] get_tim error: %s",126 printf("[NET MISC,%d] get_tim error: %s", 129 127 nc->cepid, itron_strerror(ret)); 130 128 break; -
asp3_tinet_ecnl_rx/trunk/ntshell/src/netcmd.c
r364 r374 59 59 #include <netapp/resolver.h> 60 60 #include "core/ntlibc.h" 61 #include "util/ntstdio.h"61 #include <stdio.h> 62 62 #include "ntp_cli.h" 63 63 #include "kernel_cfg.h" 64 65 extern ntstdio_t ntstdio;66 64 67 65 #if defined(SUPPORT_INET6) … … 280 278 281 279 if ((line = lookup_ipaddr(&addr, line, apip)) == NULL) { 282 ntstdio_printf(&ntstdio,"[PING] unknown host.\n");280 printf("[PING] unknown host.\n"); 283 281 return 0; 284 282 } … … 299 297 #if defined(SUPPORT_INET4) 300 298 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)); 302 300 ping6(&addr, (uint_t)tmo, (uint_t)size); 303 301 } 304 302 else { 305 303 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)); 307 305 ping4(&addr4, (uint_t)tmo, (uint_t)size); 308 306 } 309 307 #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)); 311 309 ping6(&addr, (uint_t)tmo, (uint_t)size); 312 310 #endif /* of #if defined(SUPPORT_INET4) */ 313 311 #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)); 315 313 ping4(&addr, (uint_t)tmo, (uint_t)size); 316 314 #endif /* of #if defined(SUPPORT_INET6) */ … … 331 329 pos = str_ipv4addr(temp, sizeof(temp), &svaddr, 0); 332 330 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", 335 333 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", 337 335 rebind / 3600, (rebind / 60) % 60, rebind % 60, 338 336 expire / 3600, (expire / 60) % 60, expire % 60); 339 337 } 340 338 else if (ret == E_OBJ) 341 ntstdio_printf(&ntstdio,"DHCPv4 server: not available.\n");339 printf("DHCPv4 server: not available.\n"); 342 340 } 343 341 … … 351 349 if (ntlibc_strcmp(argv[1], "rel") == 0) { 352 350 ret = dhcp4c_rel_info(); 353 ntstdio_printf(&ntstdio,"dhcp4c_rel_info %d\n", ret);351 printf("dhcp4c_rel_info %d\n", ret); 354 352 } 355 353 else if (ntlibc_strcmp(argv[1], "renew") == 0) { 356 354 ret = dhcp4c_renew_info(); 357 ntstdio_printf(&ntstdio,"dhcp4c_renew_info %d\n", ret);355 printf("dhcp4c_renew_info %d\n", ret); 358 356 } 359 357 else { … … 383 381 else { 384 382 for (c = 1; c <= *ptr; c++) 385 ntstdio_printf(&ntstdio,"%c", *(ptr + c));383 printf("%c", *(ptr + c)); 386 384 ptr += *ptr + 1; 387 385 if (*ptr) 388 ntstdio_printf(&ntstdio,".");386 printf("."); 389 387 } 390 388 } … … 406 404 return error; 407 405 408 ntstdio_printf(&ntstdio," mname: ");406 printf(" mname: "); 409 407 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: "); 412 410 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); 420 418 421 419 return E_OK; … … 433 431 int scount; 434 432 435 ntstdio_printf(&ntstdio,"question section: %d\n", rslv->dns_hdr.qdcount);433 printf("question section: %d\n", rslv->dns_hdr.qdcount); 436 434 offset = rslv->qd_offset; 437 435 for (scount = 1; scount <= rslv->dns_hdr.qdcount; scount++) { … … 439 437 return error; 440 438 441 ntstdio_printf(&ntstdio,"%2d: ", scount);439 printf("%2d: ", scount); 442 440 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)); 444 442 offset = error; 445 443 } … … 463 461 int pos; 464 462 465 ntstdio_printf(&ntstdio,"%10s section: %d\n", title, scount);463 printf("%10s section: %d\n", title, scount); 466 464 for (count = 1; count <= scount; count++) { 467 465 if ((error = dns_analyze_rr(&rr, offset, msg, length)) < 0) 468 466 return error; 469 467 470 ntstdio_printf(&ntstdio,"%2d: ", count);468 printf("%2d: ", count); 471 469 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", 473 471 dns_strtype(rr.type), dns_strclass(rr.class), rr.ttl, rr.rdlength, rr.rdata_offset); 474 472 … … 479 477 pos = str_ipv4addr(temp, sizeof(temp), &in4_addr, 0); 480 478 temp[pos] = '\0'; 481 ntstdio_printf(&ntstdio," IPv4 addr: %s\n", temp);479 printf(" IPv4 addr: %s\n", temp); 482 480 break; 483 481 case DNS_TYPE_NS: 484 ntstdio_printf(&ntstdio," host: ");482 printf(" host: "); 485 483 s_show_dns_domain_name(msg, rr.rdata_offset); 486 ntstdio_putc(&ntstdio,'\n');484 putchar('\n'); 487 485 break; 488 486 case DNS_TYPE_CNAME: 489 ntstdio_printf(&ntstdio," host: ");487 printf(" host: "); 490 488 s_show_dns_domain_name(msg, rr.rdata_offset); 491 ntstdio_putc(&ntstdio,'\n');489 putchar('\n'); 492 490 break; 493 491 case DNS_TYPE_SOA: … … 495 493 break; 496 494 case DNS_TYPE_PTR: 497 ntstdio_printf(&ntstdio," PTR: ");495 printf(" PTR: "); 498 496 s_show_dns_domain_name(msg, rr.rdata_offset); 499 ntstdio_putc(&ntstdio,'\n');497 putchar('\n'); 500 498 break; 501 499 case DNS_TYPE_AAAA: … … 503 501 pos = str_ipv6addr(temp, sizeof(temp), &in6_addr, 0); 504 502 temp[pos] = '\0'; 505 ntstdio_printf(&ntstdio," IPv6 addr: %s\n", temp);503 printf(" IPv6 addr: %s\n", temp); 506 504 break; 507 505 default: 508 ntstdio_printf(&ntstdio," data: ");506 printf(" data: "); 509 507 col = 32; 510 508 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)); 512 510 if (--col == 0) { 513 ntstdio_printf(&ntstdio,"\n ");511 printf("\n "); 514 512 col = 32; 515 513 } 516 514 } 517 ntstdio_putc(&ntstdio,'\n');515 putchar('\n'); 518 516 break; 519 517 } … … 539 537 #if defined(SUPPORT_INET6) 540 538 541 ntstdio_printf(&ntstdio,"domain name: %s\n", dns_in6_get_dname());539 printf("domain name: %s\n", dns_in6_get_dname()); 542 540 543 541 #else /* of #if defined(SUPPORT_INET6) */ 544 542 545 ntstdio_printf(&ntstdio,"domain name: %s\n", dns_in4_get_dname());543 printf("domain name: %s\n", dns_in4_get_dname()); 546 544 547 545 #endif /* of #if defined(SUPPORT_INET6) */ … … 549 547 #if defined(SUPPORT_INET6) 550 548 dns_in6_get_addr(&in6_addr); 551 ntstdio_printf(&ntstdio,"IPv6 DNS server: ");549 printf("IPv6 DNS server: "); 552 550 if (IN6_IS_ADDR_UNSPECIFIED(&in6_addr)) 553 ntstdio_printf(&ntstdio,"not available.\n");551 printf("not available.\n"); 554 552 else { 555 553 pos = str_ipv6addr(temp, sizeof(temp), &in6_addr, 0); 556 554 temp[pos] = '\0'; 557 ntstdio_printf(&ntstdio,"%s.\n", temp);555 printf("%s.\n", temp); 558 556 } 559 557 #endif /* of #if defined(SUPPORT_INET6) */ … … 561 559 #if defined(SUPPORT_INET4) 562 560 dns_in4_get_addr(&in4_addr); 563 ntstdio_printf(&ntstdio,"IPv4 DNS server: ");561 printf("IPv4 DNS server: "); 564 562 if (in4_addr == IPV4_ADDRANY) 565 ntstdio_printf(&ntstdio,"not available.\n");563 printf("not available.\n"); 566 564 else { 567 565 pos = str_ipv4addr(temp, sizeof(temp), &in4_addr, 0); 568 566 temp[pos] = '\0'; 569 ntstdio_printf(&ntstdio,"%s.\n", temp);567 printf("%s.\n", temp); 570 568 } 571 569 #endif /* of #if defined(SUPPORT_INET4) */ … … 604 602 line = skip_blanks(resolv_options(&flags, line, DEFAULT_API_PROTO)); 605 603 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"); 607 605 return 0; 608 606 } … … 620 618 621 619 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)); 623 621 return 0; 624 622 } 625 623 626 624 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)); 628 626 goto err_ret; 629 627 } 630 628 631 629 dly_tsk(1 * 1000); 632 ntstdio_printf(&ntstdio,"DNS header: flags: ");630 printf("DNS header: flags: "); 633 631 if (rslv.dns_hdr.code & (DNS_QR_RESPONSE | DNS_AUTHORITATIVE | 634 632 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", 646 644 (rslv.dns_hdr.code & DNS_RCODE_MASK) > DNS_RCODE_REFUSED 647 645 ? "6" : rcode_str[rslv.dns_hdr.code & DNS_RCODE_MASK]); 648 646 649 647 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)); 651 649 } 652 650 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)); 654 652 } 655 653 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)); 657 655 } 658 656 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)); 660 658 } 661 659 662 660 err_ret: 663 661 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)); 665 663 return 0; 666 664 } -
asp3_tinet_ecnl_rx/trunk/ntshell/src/ntp_cli.c
r364 r374 50 50 #include <t_syslog.h> 51 51 #include "kernel_cfg.h" 52 #include "util/ntstdio.h" 53 54 extern ntstdio_t ntstdio; 52 #include <stdio.h> 55 53 56 54 #endif /* of #if defined(TARGET_KERNEL_ASP) */ … … 279 277 } 280 278 281 ntstdio_printf(&ntstdio,"[NTP CLI,%d] recv time: %s .%09u\n",279 printf("[NTP CLI,%d] recv time: %s .%09u\n", 282 280 nc->cepid, nc->buf, tp.tv_nsec); 283 281 } … … 311 309 line = lookup_ipaddr(&nc->ipaddr6, NTP_SRV_URL, API_PROTO_IPV4); 312 310 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.", 314 312 nc->cepid, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ); 315 313 nc->timer = SLP_ITV; … … 319 317 #else /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) */ 320 318 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.", 322 320 nc->cepid, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ); 323 321 nc->timer = SLP_ITV; … … 423 421 424 422 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", 426 424 nc->cepid, itron_strerror(error)); 427 425 return error; … … 441 439 ret = get_tim(&time); 442 440 if (ret != E_OK) { 443 ntstdio_printf(&ntstdio,"[NTP CLI,%d] get_tim error: %s",441 printf("[NTP CLI,%d] get_tim error: %s", 444 442 nc->cepid, itron_strerror(ret)); 445 443 tp->tv_sec = 0; … … 461 459 ret = set_tim(time); 462 460 if (ret != E_OK) { 463 ntstdio_printf(&ntstdio,"[NTP CLI,%d] set_tim error: %s",461 printf("[NTP CLI,%d] set_tim error: %s", 464 462 nc->cepid, itron_strerror(ret)); 465 463 } … … 479 477 if (len < 0 && len != E_RLWAI) { 480 478 /* 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, 482 480 itron_strerror(len), in_strtfn(fncd)); 483 481 } … … 486 484 if ((len = udp_rcv_dat(nc->cepid, &nc->rcv_rmt, &nc->ntp_msg, len, TMO_POL)) < 0) 487 485 { 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, 489 487 itron_strerror(len)); 490 488 } … … 518 516 519 517 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); 521 519 522 520 /* 初期化 */ … … 525 523 ret = get_tim(&time); 526 524 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", 528 526 nc->cepid, time / SYSTIM_HZ, itron_strerror(ret)); 529 527 return; … … 539 537 error = tslp_tsk(timer); 540 538 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", 542 540 nc->cepid, itron_strerror(error), timer); 543 541 break; … … 546 544 ret = get_tim(&time); 547 545 if (ret != E_OK) { 548 ntstdio_printf(&ntstdio,"[NTP CLI,%d] get_tim error: %s",546 printf("[NTP CLI,%d] get_tim error: %s", 549 547 nc->cepid, itron_strerror(ret)); 550 548 break; -
asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell_main.c
r364 r374 59 59 #include "ntshell_main.h" 60 60 #include "socket_stub.h" 61 #include "usb_hbth.h"62 #include "mbed_api.h"63 64 extern int bt_bnep_mode;65 61 66 62 char command[NTOPT_TEXT_MAXLEN]; 67 ntstdio_t ntstdio;68 63 69 64 extern uint8_t mac_addr[6]; … … 88 83 volatile int ntshell_state; 89 84 jmp_buf process_exit; 90 void sys_init(void); 91 NTSHELL_SERIAL_READ ntshell_serial_read = 0; 92 NTSHELL_SERIAL_WRITE ntshell_serial_write = 0; 93 void *ntshell_serial_extobj; 94 95 unsigned char ntstdio_xi(struct ntstdio_t *handle) 96 { 97 unsigned char buf[1]; 98 ntshell_serial_read((char *)buf, 1, ntshell_serial_extobj); 99 return buf[0]; 100 } 101 102 void ntstdio_xo(struct ntstdio_t *handle, unsigned char c) 103 { 104 char buf[1]; 105 buf[0] = c; 106 ntshell_serial_write(buf, 1, ntshell_serial_extobj); 107 } 108 109 void ntshell_task_init(NTSHELL_SERIAL_READ func_read, 110 NTSHELL_SERIAL_WRITE func_write, void *extobj) 111 { 112 ntshell_serial_read = func_read; 113 ntshell_serial_write = func_write; 114 ntshell_serial_extobj = extobj; 115 116 sys_init(); 117 118 ntstdio_init(&ntstdio, NTSTDIO_OPTION_LINE_ECHO | NTSTDIO_OPTION_CANON | NTSTDIO_OPTION_LF_CRLF | NTSTDIO_OPTION_LF_CR, ntstdio_xi, ntstdio_xo); 85 86 void ntshell_task_init(ID portid) 87 { 88 serial_ctl_por(portid, IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV); 119 89 } 120 90 … … 178 148 const cmd_table_t *p = cmd_table_info.table; 179 149 for (int i = 0; i < cmd_table_info.count; i++) { 180 ntstdio_puts(&ntstdio, p->cmd); 181 ntstdio_puts(&ntstdio, "\t:"); 182 ntstdio_puts(&ntstdio, p->desc); 183 ntstdio_puts(&ntstdio, "\n"); 150 fwrite(p->cmd, strlen(p->cmd), 1, stdout); 151 fwrite("\t:", strlen("\t:"), 1, stdout); 152 puts(p->desc); 184 153 p++; 185 154 } … … 207 176 int execute_command(int wait) 208 177 { 178 T_RTSK rtsk; 209 179 ER ret; 210 180 … … 229 199 do { 230 200 tslp_tsk(100000); 201 202 ret = ref_tsk(NTSHELL_TASK, &rtsk); 203 if ((ret != E_OK) || (rtsk.tskstat == TTS_DMT)) 204 ntshell_state = 3; 231 205 } while(ntshell_state == 1); 232 206 … … 238 212 ntlibc_strlcpy(command, text, sizeof(command)); 239 213 return execute_command(1); 240 }241 242 int stdio_close(struct _IO_FILE *fp)243 {244 return -EPERM;245 }246 247 size_t stdio_read(struct _IO_FILE *fp, unsigned char *data, size_t len)248 {249 return -EPERM;250 }251 252 size_t stdio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)253 {254 return -EPERM;255 }256 257 size_t stdin_read(struct _IO_FILE *fp, unsigned char *data, size_t len)258 {259 int i = 0;260 while (i < len) {261 int c = ntstdio_getc(&ntstdio);262 data[i++] = c;263 if ((c == EOF) || (c == '\n'))264 break;265 }266 return i;267 }268 269 size_t stdout_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)270 {271 for (int i = 0; i < len; i++) {272 ntstdio_putc(&ntstdio, data[i]);273 }274 return len;275 }276 277 size_t stderr_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)278 {279 for (int i = 0; i < len; i++) {280 ntstdio_putc(&ntstdio, data[i]);281 }282 return len;283 }284 285 int sio_close(struct _IO_FILE *fp)286 {287 return -EPERM;288 }289 290 size_t sio_read(struct _IO_FILE *fp, unsigned char *data, size_t len)291 {292 return -EPERM;293 }294 295 size_t sio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)296 {297 return -EPERM;298 }299 300 off_t sio_seek(struct _IO_FILE *fp, off_t ofs, int org)301 {302 return -EPERM;303 }304 305 int sio_ioctl(struct _IO_FILE *fp, int request, void *arg)306 {307 switch (request) {308 case TIOCGWINSZ:309 return 0;310 case TCGETS:311 return sio_tcgetattr(fp->fd, (struct termios *)arg);312 case TCSETS + TCSANOW:313 case TCSETS + TCSADRAIN:314 case TCSETS + TCSAFLUSH:315 return sio_tcsetattr(fp->fd, request - TCSETS, (const struct termios *)arg);316 }317 318 return -EINVAL;319 214 } 320 215 … … 457 352 } 458 353 354 int shell_kill(int pid, int sig) 355 { 356 DebugBreak(); 357 return -1; 358 } 359 360 int 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_rx/trunk/ntshell/src/ntshell_main.cfg
r364 r374 41 41 #include "ntshell_main.h" 42 42 43 ATT_INI({ TA_NULL, 0, sys_init }); 44 43 45 CRE_TSK(NTSHELL_TASK, { TA_NULL, 0, ntshell_task, NTSHELL_PRIORITY, NTSHELL_STACK_SIZE, NULL }); 44 46 CRE_FLG(FLG_SELECT_WAIT, { TA_WMUL, 0x00 }); -
asp3_tinet_ecnl_rx/trunk/ntshell/src/ntshell_main.h
r367 r374 76 76 extern PRI main_task_priority; 77 77 78 /* ntshellの初期化 */ 79 void sys_init(intptr_t exinf); 80 78 81 /* ntshellタスク初期化 */ 79 void ntshell_task_init(NTSHELL_SERIAL_READ func_read, 80 NTSHELL_SERIAL_WRITE func_write, void *extobj); 82 void ntshell_task_init(ID portid); 81 83 82 84 /* ntshellタスク */ -
asp3_tinet_ecnl_rx/trunk/ntshell/src/shellif.h
r364 r374 134 134 135 135 // dirent.h 136 typedef struct __dirstream DIR;136 typedef struct __dirstream FATFS_DIR; 137 137 138 138 int shell_getdents(int, struct dirent *, size_t); -
asp3_tinet_ecnl_rx/trunk/ntshell/src/socket_stub.c
r364 r374 57 57 #include <netinet/udp_var.h> 58 58 #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> 60 63 #include <netapp/resolver.h> 61 64 extern const ID tmax_tcp_cepid; … … 65 68 66 69 #define SOCKET_TIMEOUT 2000000 70 71 #define tcp6_cre_cep tcp_cre_cep 72 #define tcp6_del_cep tcp_del_cep 73 #define tcp6_del_rep tcp_del_rep 74 #define tcp6_sht_cep tcp_sht_cep 75 #define tcp6_cls_cep tcp_cls_cep 76 #define tcp6_snd_oob tcp_snd_oob 77 #define tcp6_snd_dat tcp_snd_dat 78 #define tcp6_rcv_oob tcp_rcv_oob 79 #define tcp6_rcv_buf tcp_rcv_buf 80 #define tcp6_rel_buf tcp_rel_buf 81 #define tcp6_get_opt tcp_get_opt 82 #define tcp6_set_opt tcp_set_opt 83 84 #define udp6_del_cep udp_del_cep 85 #define udp6_get_opt udp_get_opt 86 #define udp6_set_opt udp_set_opt 87 88 #ifndef SUPPORT_INET6 89 90 ER tcp6_cre_rep (ID repid, T_TCP6_CREP *pk_crep) { return E_SYS; } 91 ER tcp6_acp_cep (ID cepid, ID repid, T_IPV6EP *p_dstaddr, TMO tmout) { return E_SYS; } 92 ER tcp6_con_cep (ID cepid, T_IPV6EP *p_myaddr, T_IPV6EP *p_dstaddr, TMO tmout) { return E_SYS; } 93 94 ER udp6_cre_cep (ID cepid, T_UDP6_CCEP *pk_ccep) { return E_SYS; } 95 ER_UINT udp6_snd_dat (ID cepid, T_IPV6EP *p_dstaddr, void *data, int_t len, TMO tmout) { return E_SYS; } 96 ER_UINT udp6_rcv_dat (ID cepid, T_IPV6EP *p_dstaddr, void *data, int_t len, TMO tmout) { return E_SYS; } 97 98 const T_IN6_ADDR *in6_get_ifaddr (int_t index) { return NULL; } 99 100 #endif 101 102 ER socket_tcp_callback(ID cepid, FN fncd, void *p_parblk); 103 ER socket_tcp6_callback(ID cepid, FN fncd, void *p_parblk); 104 ER socket_udp_callback(ID cepid, FN fncd, void *p_parblk); 105 ER socket_udp6_callback(ID cepid, FN fncd, void *p_parblk); 106 107 static int tcp_fd_close(struct SHELL_FILE *fp); 108 static size_t tcp_fd_read(struct SHELL_FILE *fp, unsigned char *data, size_t len); 109 static size_t tcp_fd_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 110 static off_t tcp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org); 111 static int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg); 112 static bool_t tcp_fd_readable(struct SHELL_FILE *fp); 113 static void tcp_fd_delete(struct SHELL_FILE *fp); 114 115 static int udp_fd_close(struct SHELL_FILE *fp); 116 static size_t udp_fd_read(struct SHELL_FILE *fp, unsigned char *data, size_t len); 117 static size_t udp_fd_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 118 static off_t udp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org); 119 static int udp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg); 120 static bool_t udp_fd_readable(struct SHELL_FILE *fp); 121 static void udp_fd_delete(struct SHELL_FILE *fp); 122 123 IO_TYPE IO_TYPE_TCP = { tcp_fd_close, tcp_fd_read, tcp_fd_write, tcp_fd_seek, tcp_fd_ioctl, tcp_fd_readable, tcp_fd_delete }; 124 IO_TYPE IO_TYPE_UDP = { udp_fd_close, udp_fd_read, udp_fd_write, udp_fd_seek, udp_fd_ioctl, udp_fd_readable, udp_fd_delete }; 67 125 68 126 typedef struct id_table_t { … … 84 142 #define tcp_cepid_table_count (sizeof(tcp_cepid_table) / sizeof(tcp_cepid_table[0])) 85 143 144 #ifdef SUPPORT_INET6 145 146 id_table_t tcp6_repid_table[] = { 147 {0, USR_TCP6_REP1}, {0, USR_TCP6_REP2}, {0, USR_TCP6_REP3}, {0, USR_TCP6_REP4} 148 }; 149 #define tcp6_repid_table_count (sizeof(tcp6_repid_table) / sizeof(tcp6_repid_table[0])) 150 151 id_table_t tcp6_cepid_table[] = { 152 {0, USR_TCP6_CEP1}, {0, USR_TCP6_CEP2}, {0, USR_TCP6_CEP3}, {0, USR_TCP6_CEP4}, 153 #ifndef TOPPERS_GRSAKURA 154 {0, USR_TCP6_CEP5}, {0, USR_TCP6_CEP6}, {0, USR_TCP6_CEP7}, {0, USR_TCP6_CEP8} 155 #endif 156 }; 157 #define tcp6_cepid_table_count (sizeof(tcp6_cepid_table) / sizeof(tcp6_cepid_table[0])) 158 159 #else 160 161 #define tcp6_repid_table NULL 162 #define tcp6_repid_table_count 0 163 164 #define tcp6_cepid_table NULL 165 #define tcp6_cepid_table_count 0 166 167 #endif 168 86 169 id_table_t udp_cepid_table[] = { 87 170 {0, USR_UDP_CEP1}, {0, USR_UDP_CEP2}, {0, USR_UDP_CEP3}, {0, USR_UDP_CEP4} … … 89 172 #define udp_cepid_table_count (sizeof(udp_cepid_table) / sizeof(udp_cepid_table[0])) 90 173 174 #ifdef SUPPORT_INET6 175 176 id_table_t udp6_cepid_table[] = { 177 {0, USR_UDP6_CEP1}, {0, USR_UDP6_CEP2}, {0, USR_UDP6_CEP3}, {0, USR_UDP6_CEP4} 178 }; 179 #define udp6_cepid_table_count (sizeof(udp6_cepid_table) / sizeof(udp6_cepid_table[0])) 180 181 #else 182 183 #define udp6_cepid_table NULL 184 #define udp6_cepid_table_count 0 185 186 #endif 187 91 188 ID new_id(id_table_t *table, int count) 92 189 { … … 116 213 } 117 214 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; 215 typedef struct SHELL_FILE SOCKET; 124 216 125 217 int shell_socket(int family, int type, int protocol) … … 141 233 switch (type) { 142 234 case SOCK_STREAM: 143 fp = new_tcp_fd(0); 235 fp = new_fp(&IO_TYPE_TCP, 0, 0); 236 if (fp == NULL) 237 return -ENOMEM; 238 239 fp->exinf = malloc(sizeof(socket_t)); 240 memset(fp->exinf, 0, sizeof(socket_t)); 144 241 break; 145 242 case SOCK_DGRAM: 146 fp = new_udp_fd(0); 243 fp = new_fp(&IO_TYPE_UDP, 0, 1); 244 if (fp == NULL) 245 return -ENOMEM; 246 247 fp->exinf = malloc(sizeof(socket_t)); 248 memset(fp->exinf, 0, sizeof(socket_t)); 147 249 break; 148 250 default: … … 150 252 } 151 253 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; 254 socket_t *socket = (socket_t *)fp->exinf; 255 socket->family = family; 256 socket->type = type; 257 socket->protocol = protocol; 258 socket->flags = flags; 160 259 161 260 return fp->fd; … … 167 266 if (fp == NULL) 168 267 return -EBADF; 169 if (fp->psock->family != addr->sa_family) 268 socket_t *socket = (socket_t *)fp->exinf; 269 if (socket->family != addr->sa_family) 170 270 return -EINVAL; 171 271 … … 177 277 } 178 278 struct sockaddr_in *addr_in = (struct sockaddr_in *)addr; 179 memcpy(& fp->psock->laddr4, addr, len);180 switch ( fp->psock->type) {279 memcpy(&socket->laddr4, addr, len); 280 switch (socket->type) { 181 281 case SOCK_STREAM: { 182 282 ID cepid = new_id(tcp_cepid_table, tcp_cepid_table_count); … … 184 284 return -ENOMEM; 185 285 186 fp->psock->buf_size = 512 + 512;187 fp->psock->buf = malloc(fp->psock->buf_size);286 socket->buf_size = 512 + 512; 287 socket->buf = malloc(socket->buf_size); 188 288 #ifdef _DEBUG 189 memset( fp->psock->buf, 0, fp->psock->buf_size);289 memset(socket->buf, 0, socket->buf_size); 190 290 #endif 191 T_TCP_CCEP ccep = { 0, fp->psock->buf, 512, &fp->psock->buf[512], 512, (FP)socket_tcp_callback };291 T_TCP_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp_callback }; 192 292 ret = tcp_cre_cep(cepid, &ccep); 193 293 if (ret != E_OK) { … … 196 296 } 197 297 fp->handle = cepid; 198 fp->psock->cepid = cepid;298 socket->cepid = cepid; 199 299 break; 200 300 } … … 211 311 } 212 312 fp->handle = cepid; 213 fp->psock->cepid = cepid;313 socket->cepid = cepid; 214 314 break; 215 315 } … … 223 323 return -EINVAL; 224 324 } 225 memcpy(&fp->psock->laddr4, addr, len); 226 break; 227 } 325 struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)addr; 326 memcpy(&socket->laddr6, addr, len); 327 switch (socket->type) { 328 case SOCK_STREAM: { 329 ID cepid = new_id(tcp6_cepid_table, tcp6_cepid_table_count); 330 if (cepid < 0) 331 return -ENOMEM; 332 333 socket->buf_size = 512 + 512; 334 socket->buf = malloc(socket->buf_size); 335 #ifdef _DEBUG 336 memset(socket->buf, 0, socket->buf_size); 337 #endif 338 T_TCP6_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp6_callback }; 339 ret = tcp6_cre_cep(cepid, &ccep); 340 if (ret != E_OK) { 341 delete_id(tcp6_cepid_table, tcp6_cepid_table_count, cepid); 342 return -ENOMEM; 343 } 344 fp->handle = cepid; 345 socket->cepid = cepid; 346 break; 347 } 348 case SOCK_DGRAM: { 349 ID cepid = new_id(udp_cepid_table, udp_cepid_table_count); 350 if (cepid < 0) 351 return -ENOMEM; 352 353 T_UDP6_CCEP ccep = { 0, {ntohl(addr_in6->sin6_addr.__in6_union.__s6_addr), ntohs(addr_in6->sin6_port)}, (FP)socket_udp6_callback }; 354 ret = udp6_cre_cep(cepid, &ccep); 355 if (ret != E_OK) { 356 delete_id(udp_cepid_table, udp_cepid_table_count, cepid); 357 return -ENOMEM; 358 } 359 fp->handle = cepid; 360 socket->cepid = cepid; 361 break; 362 } 363 default: 364 return -ENOPROTOOPT; 365 } 366 break; 367 } 368 default: 369 return -ENOPROTOOPT; 228 370 } 229 371 … … 236 378 if (fp == NULL) 237 379 return -EBADF; 238 if (fp->psock->type != SOCK_STREAM) 380 socket_t *socket = (socket_t *)fp->exinf; 381 if (socket->type != SOCK_STREAM) 239 382 return -EINVAL; 240 383 241 fp->psock->backlog = backlog;384 socket->backlog = backlog; 242 385 243 386 ER ret; 244 switch ( fp->psock->family) {387 switch (socket->family) { 245 388 case AF_INET: { 246 389 ID repid = new_id(tcp_repid_table, tcp_repid_table_count); … … 248 391 return -ENOMEM; 249 392 250 struct sockaddr_in *laddr = & fp->psock->laddr4;393 struct sockaddr_in *laddr = &socket->laddr4; 251 394 T_TCP_CREP crep = { 0, {ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port)} }; 252 395 ret = tcp_cre_rep(repid, &crep); … … 255 398 return -ENOMEM; 256 399 } 257 fp->psock->repid = repid;400 socket->repid = repid; 258 401 break; 259 402 } 260 403 case AF_INET6: { 261 break; 262 } 404 ID repid = new_id(tcp6_repid_table, tcp6_repid_table_count); 405 if (repid < 0) 406 return -ENOMEM; 407 408 struct sockaddr_in6 *laddr = &socket->laddr6; 409 T_TCP6_CREP crep = { 0, {ntohl(laddr->sin6_addr.__in6_union.__s6_addr), ntohs(laddr->sin6_port)} }; 410 ret = tcp6_cre_rep(repid, &crep); 411 if (ret != E_OK) { 412 delete_id(tcp6_repid_table, tcp6_repid_table_count, repid); 413 return -ENOMEM; 414 } 415 socket->repid = repid; 416 break; 417 } 418 default: 419 return -ENOPROTOOPT; 263 420 } 264 421 … … 271 428 if (fp == NULL) 272 429 return -EBADF; 273 if (fp->psock->type != SOCK_STREAM) 430 socket_t *socket = (socket_t *)fp->exinf; 431 if (socket->type != SOCK_STREAM) 274 432 return -EINVAL; 275 433 276 434 ER ret; 277 switch ( fp->psock->family) {435 switch (socket->family) { 278 436 case AF_INET: { 279 437 if (len < 8) { 280 438 return -EINVAL; 281 439 } 282 if ( fp->psock->cepid == 0) {440 if (socket->cepid == 0) { 283 441 ID cepid = new_id(tcp_cepid_table, tcp_cepid_table_count); 284 442 if (cepid < 0) 285 443 return -ENOMEM; 286 444 287 fp->psock->buf_size = 512 + 512;288 fp->psock->buf = malloc(fp->psock->buf_size);445 socket->buf_size = 512 + 512; 446 socket->buf = malloc(socket->buf_size); 289 447 #ifdef _DEBUG 290 memset( fp->psock->buf, 0, fp->psock->buf_size);448 memset(socket->buf, 0, socket->buf_size); 291 449 #endif 292 T_TCP_CCEP ccep = { 0, fp->psock->buf, 512, &fp->psock->buf[512], 512, (FP)socket_tcp_callback };450 T_TCP_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp_callback }; 293 451 ret = tcp_cre_cep(cepid, &ccep); 294 452 if (ret != E_OK) { … … 297 455 } 298 456 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;457 socket->cepid = cepid; 458 } 459 struct sockaddr_in *laddr = &socket->laddr4; 460 struct sockaddr_in *raddr = &socket->raddr4; 303 461 memset(raddr, 0, sizeof(*raddr)); 304 462 memcpy(raddr, addr, len); 305 463 T_IPV4EP lep = { ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port) }; 306 464 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);465 ret = tcp_con_cep(socket->cepid, &lep, &rep, SOCKET_TIMEOUT); 308 466 if (ret < 0) { 309 467 return -EHOSTUNREACH; … … 312 470 } 313 471 case AF_INET6: { 314 break; 315 } 472 if (len < 20) { 473 return -EINVAL; 474 } 475 if (socket->cepid == 0) { 476 ID cepid = new_id(tcp6_cepid_table, tcp6_cepid_table_count); 477 if (cepid < 0) 478 return -ENOMEM; 479 480 socket->buf_size = 512 + 512; 481 socket->buf = malloc(socket->buf_size); 482 #ifdef _DEBUG 483 memset(socket->buf, 0, socket->buf_size); 484 #endif 485 T_TCP6_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp6_callback }; 486 ret = tcp6_cre_cep(cepid, &ccep); 487 if (ret != E_OK) { 488 delete_id(tcp6_cepid_table, tcp6_cepid_table_count, cepid); 489 return -ENOMEM; 490 } 491 fp->handle = cepid; 492 socket->cepid = cepid; 493 } 494 struct sockaddr_in6 *laddr = &socket->laddr6; 495 struct sockaddr_in6 *raddr = &socket->raddr6; 496 memset(raddr, 0, sizeof(*raddr)); 497 memcpy(raddr, addr, len); 498 T_IPV6EP lep = { ntohl(laddr->sin6_addr.__in6_union.__s6_addr), ntohs(laddr->sin6_port) }; 499 T_IPV6EP rep = { ntohl(raddr->sin6_addr.__in6_union.__s6_addr), ntohs(raddr->sin6_port) }; 500 ret = tcp6_con_cep(socket->cepid, &lep, &rep, SOCKET_TIMEOUT); 501 if (ret < 0) { 502 return -EHOSTUNREACH; 503 } 504 break; 505 } 506 default: 507 return -ENOPROTOOPT; 316 508 } 317 509 … … 324 516 if (lfp == NULL) 325 517 return -EBADF; 326 if ( lfp->psock->type != SOCK_STREAM)518 if (((socket_t *)lfp->exinf)->type != SOCK_STREAM) 327 519 return -EINVAL; 328 520 329 SOCKET *fp = new_ tcp_fd(0);330 if (fp == NULL) {521 SOCKET *fp = new_fp(&IO_TYPE_TCP, 0, 0); 522 if (fp == NULL) 331 523 return -ENOMEM; 332 } 333 334 memcpy(fp->psock, lfp->psock, offsetof(socket_t, buf_size)); 524 525 fp->exinf = malloc(sizeof(socket_t)); 526 memset(fp->exinf, 0, sizeof(socket_t)); 527 528 memcpy(fp->exinf, lfp->exinf, offsetof(socket_t, buf_size)); 335 529 336 530 ER ret; 337 switch (fp->psock->family) { 531 socket_t *socket = (socket_t *)fp->exinf; 532 switch (socket->family) { 338 533 case AF_INET: { 339 534 ID cepid; 340 if ( fp->psock->cepid == 0) {535 if (socket->cepid == 0) { 341 536 cepid = new_id(tcp_cepid_table, tcp_cepid_table_count); 342 537 if (cepid < 0) 343 538 return -ENOMEM; 344 539 345 fp->psock->buf_size = 512 + 512;346 fp->psock->buf = malloc(fp->psock->buf_size);540 socket->buf_size = 512 + 512; 541 socket->buf = malloc(socket->buf_size); 347 542 #ifdef _DEBUG 348 memset( fp->psock->buf, 0, fp->psock->buf_size);543 memset(socket->buf, 0, socket->buf_size); 349 544 #endif 350 T_TCP_CCEP ccep = { 0, fp->psock->buf, 512, &fp->psock->buf[512], 512, (FP)socket_tcp_callback };545 T_TCP_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp_callback }; 351 546 ret = tcp_cre_cep(cepid, &ccep); 352 547 if (ret != E_OK) { … … 355 550 } 356 551 fp->handle = cepid; 357 fp->psock->cepid = cepid;552 socket->cepid = cepid; 358 553 } 359 554 else { 360 cepid = lfp->psock->cepid;555 cepid = ((socket_t *)lfp->exinf)->cepid; 361 556 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;557 lfp->handle = tmax_tcp_cepid + ((socket_t *)lfp->exinf)->repid; 558 ((socket_t *)lfp->exinf)->cepid = 0; 559 ((socket_t *)lfp->exinf)->buf_size = 0; 560 ((socket_t *)lfp->exinf)->buf = 0; 366 561 } 367 562 T_IPV4EP rep = { 0, 0 }; 368 ret = tcp_acp_cep( fp->psock->cepid, fp->psock->repid, &rep, TMO_FEVR);563 ret = tcp_acp_cep(socket->cepid, socket->repid, &rep, TMO_FEVR); 369 564 if (ret < 0) { 370 565 return -ENOMEM; 371 566 } 372 struct sockaddr_in *raddr = & fp->psock->raddr4;567 struct sockaddr_in *raddr = &socket->raddr4; 373 568 memset(raddr, 0, sizeof(*raddr)); 374 569 raddr->sin_family = AF_INET; 375 570 raddr->sin_port = htons(rep.portno); 376 571 raddr->sin_addr.s_addr = htonl(rep.ipaddr); 572 573 if (addr != NULL && len != NULL) { 574 int sz = *len; 575 if (sz < 8) { 576 return -EINVAL; 577 } 578 struct sockaddr_in *raddr = &socket->raddr4; 579 if (sz > sizeof(*raddr)) 580 sz = sizeof(*raddr); 581 memcpy(addr, raddr, sz); 582 *len = sizeof(*raddr); 583 } 377 584 break; 378 585 } 379 586 case AF_INET6: { 380 return -EAFNOSUPPORT; 381 } 382 } 383 384 if (addr != NULL && len != NULL) { 385 int sz = *len; 386 if (sz < 8) { 387 return -EINVAL; 388 } 389 struct sockaddr_in *raddr = &fp->psock->raddr4; 390 if (sz > sizeof(*raddr)) 391 sz = sizeof(*raddr); 392 memcpy(addr, raddr, sz); 393 *len = sizeof(*raddr); 587 ID cepid; 588 if (socket->cepid == 0) { 589 cepid = new_id(tcp6_cepid_table, tcp6_cepid_table_count); 590 if (cepid < 0) 591 return -ENOMEM; 592 593 socket->buf_size = 512 + 512; 594 socket->buf = malloc(socket->buf_size); 595 #ifdef _DEBUG 596 memset(socket->buf, 0, socket->buf_size); 597 #endif 598 T_TCP6_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp6_callback }; 599 ret = tcp6_cre_cep(cepid, &ccep); 600 if (ret != E_OK) { 601 delete_id(tcp6_cepid_table, tcp6_cepid_table_count, cepid); 602 return -ENOMEM; 603 } 604 fp->handle = cepid; 605 socket->cepid = cepid; 606 } 607 else { 608 cepid = ((socket_t *)lfp->exinf)->cepid; 609 fp->handle = cepid; 610 lfp->handle = tmax_tcp6_cepid + ((socket_t *)lfp->exinf)->repid; 611 ((socket_t *)lfp->exinf)->cepid = 0; 612 ((socket_t *)lfp->exinf)->buf_size = 0; 613 ((socket_t *)lfp->exinf)->buf = 0; 614 } 615 T_IPV6EP rep = { 0, 0 }; 616 ret = tcp6_acp_cep(socket->cepid, socket->repid, &rep, TMO_FEVR); 617 if (ret < 0) { 618 return -ENOMEM; 619 } 620 struct sockaddr_in6 *raddr = &socket->raddr6; 621 memset(raddr, 0, sizeof(*raddr)); 622 raddr->sin6_family = AF_INET; 623 raddr->sin6_port = htons(rep.portno); 624 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN 625 memcpy(raddr->sin6_addr.__in6_union.__s6_addr, rep.ipaddr.__u6_addr.__u6_addr8, 16); 626 #else 627 for (int i = 0; i < 16; i++) 628 raddr->sin6_addr.__in6_union.__s6_addr[i] = rep.ipaddr.__u6_addr.__u6_addr8[i]; 629 #endif 630 631 if (addr != NULL && len != NULL) { 632 int sz = *len; 633 if (sz < 8) { 634 return -EINVAL; 635 } 636 struct sockaddr_in6 *raddr = &socket->raddr6; 637 if (sz > sizeof(*raddr)) 638 sz = sizeof(*raddr); 639 memcpy(addr, raddr, sz); 640 *len = sizeof(*raddr); 641 } 642 break; 643 } 644 default: 645 return -ENOPROTOOPT; 394 646 } 395 647 … … 405 657 406 658 int ret = 0; 407 switch (fp->psock->family) { 659 socket_t *socket = (socket_t *)fp->exinf; 660 switch (socket->family) { 408 661 case AF_INET: { 409 switch ( fp->psock->type) {662 switch (socket->type) { 410 663 case SOCK_STREAM: { 411 664 if ((addr != NULL) || (alen != 0)) { … … 414 667 415 668 if (flags & MSG_OOB) { 416 ret = tcp_snd_oob( fp->psock->cepid, (void *)buf, len, SOCKET_TIMEOUT);669 ret = tcp_snd_oob(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT); 417 670 if (ret < 0) { 418 671 return -ECOMM; … … 421 674 else { 422 675 for (;;) { 423 ret = tcp_snd_dat( fp->psock->cepid, (void *)buf, len, SOCKET_TIMEOUT);676 ret = tcp_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT); 424 677 if (ret < 0) { 425 678 if (ret == E_TMOUT) … … 440 693 return -EINVAL; 441 694 } 442 struct sockaddr_in *raddr = & fp->psock->raddr4;695 struct sockaddr_in *raddr = &socket->raddr4; 443 696 memset(raddr, 0, sizeof(*raddr)); 444 697 memcpy(raddr, addr, sz); 445 698 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);699 ret = udp_snd_dat(socket->cepid, &rep, (void *)buf, len, 700 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 448 701 if (ret < 0) { 449 702 return (ret == E_TMOUT) ? -ETIME : -ECOMM; … … 455 708 } 456 709 case AF_INET6: { 457 return -EAFNOSUPPORT; 458 } 710 switch (socket->type) { 711 case SOCK_STREAM: { 712 if ((addr != NULL) || (alen != 0)) { 713 return -EISCONN; 714 } 715 716 if (flags & MSG_OOB) { 717 ret = tcp6_snd_oob(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT); 718 if (ret < 0) { 719 return -ECOMM; 720 } 721 } 722 else { 723 for (;;) { 724 ret = tcp6_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT); 725 if (ret < 0) { 726 if (ret == E_TMOUT) 727 return -ETIME; 728 return -ECOMM; 729 } 730 len -= ret; 731 if (len <= 0) 732 break; 733 buf = (const void *)&((uint8_t *)buf)[ret]; 734 } 735 } 736 break; 737 } 738 case SOCK_DGRAM: { 739 int sz = alen; 740 if ((addr == NULL) || (sz < 8)) { 741 return -EINVAL; 742 } 743 struct sockaddr_in6 *raddr = &socket->raddr6; 744 memset(raddr, 0, sizeof(*raddr)); 745 memcpy(raddr, addr, sz); 746 T_IPV6EP rep = { ntohl(raddr->sin6_addr.__in6_union.__s6_addr), ntohs(raddr->sin6_port) }; 747 ret = udp6_snd_dat(socket->cepid, &rep, (void *)buf, len, 748 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 749 if (ret < 0) { 750 return (ret == E_TMOUT) ? -ETIME : -ECOMM; 751 } 752 break; 753 } 754 } 755 break; 756 } 757 default: 758 return -ENOPROTOOPT; 459 759 } 460 760 … … 476 776 477 777 int ret = 0; 478 switch (fp->psock->family) { 778 socket_t *socket = (socket_t *)fp->exinf; 779 switch (socket->family) { 479 780 case AF_INET: { 480 switch ( fp->psock->type) {781 switch (socket->type) { 481 782 case SOCK_STREAM: { 482 783 if (flags & MSG_OOB) { 483 ret = tcp_rcv_oob( fp->psock->cepid, buf, len);784 ret = tcp_rcv_oob(socket->cepid, buf, len); 484 785 if (ret < 0) { 485 786 syslog(LOG_ERROR, "tcp_rcv_oob => %d", ret); … … 489 790 else { 490 791 int rsz, tmp; 491 if ( fp->psock->input == NULL) {792 if (socket->input == NULL) { 492 793 ret = wai_sem(SEM_FILEDESC); 493 794 if (ret < 0) { 494 795 syslog(LOG_ERROR, "wai_sem => %d", ret); 495 796 } 496 fp->psock->len = 0;797 socket->len = 0; 497 798 ret = sig_sem(SEM_FILEDESC); 498 799 if (ret < 0) { 499 800 syslog(LOG_ERROR, "sig_sem => %d", ret); 500 801 } 501 ret = tcp_rcv_buf( fp->psock->cepid, &fp->psock->input, TMO_FEVR);802 ret = tcp_rcv_buf(socket->cepid, &socket->input, TMO_FEVR); 502 803 if (ret < 0) { 503 804 syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret); … … 507 808 } 508 809 else 509 rsz = fp->psock->len;810 rsz = socket->len; 510 811 tmp = rsz; 511 812 if (rsz > len) 512 813 rsz = len; 513 814 if (rsz >= 0) { 514 memcpy(buf, fp->psock->input, rsz);815 memcpy(buf, socket->input, rsz); 515 816 ret = wai_sem(SEM_FILEDESC); 516 817 if (ret < 0) { 517 818 syslog(LOG_ERROR, "wai_sem => %d", ret); 518 819 } 519 fp->psock->len = tmp - rsz;820 socket->len = tmp - rsz; 520 821 ret = sig_sem(SEM_FILEDESC); 521 822 if (ret < 0) { … … 523 824 } 524 825 if (tmp - rsz == 0) { 525 fp->psock->input = NULL;826 socket->input = NULL; 526 827 } 527 828 else 528 fp->psock->input = (void *)&((uint8_t *)fp->psock->input)[rsz];529 ret = tcp_rel_buf( fp->psock->cepid, rsz);829 socket->input = (void *)&((uint8_t *)socket->input)[rsz]; 830 ret = tcp_rel_buf(socket->cepid, rsz); 530 831 if ((ret != E_OBJ) && (ret < 0)) { 531 832 syslog(LOG_ERROR, "tcp_rel_buf => %d", ret); … … 538 839 } 539 840 case SOCK_DGRAM: { 540 struct sockaddr_in *raddr = & fp->psock->raddr4;841 struct sockaddr_in *raddr = &socket->raddr4; 541 842 int rsz; 542 843 ret = wai_sem(SEM_FILEDESC); … … 544 845 syslog(LOG_ERROR, "wai_sem => %d", ret); 545 846 } 546 T_NET_BUF *input = fp->psock->input;847 T_NET_BUF *input = socket->input; 547 848 if (input == NULL) { 548 849 ret = sig_sem(SEM_FILEDESC); … … 552 853 553 854 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);855 ret = udp_rcv_dat(socket->cepid, &rep, buf, len, 856 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 556 857 if (ret < 0) { 557 syslog(LOG_ERROR, "udp_rcv_buf => %d", ret); 858 if ((socket->flags & O_NONBLOCK) == 0) 859 syslog(LOG_ERROR, "udp_rcv_buf => %d", ret); 558 860 return (ret == E_TMOUT) ? -ETIME : -ECOMM; 559 861 } … … 565 867 } 566 868 int sz = *alen; 567 memset(raddr, 0, sizeof( fp->psock->raddr4));869 memset(raddr, 0, sizeof(socket->raddr4)); 568 870 raddr->sin_family = AF_INET; 569 871 raddr->sin_port = htons(rep.portno); 570 872 raddr->sin_addr.s_addr = htonl(rep.ipaddr); 571 if (sz > sizeof( fp->psock->raddr4))572 sz = sizeof( fp->psock->raddr4);873 if (sz > sizeof(socket->raddr4)) 874 sz = sizeof(socket->raddr4); 573 875 memcpy(addr, raddr, sz); 574 876 *alen = sz; … … 580 882 } 581 883 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;884 rsz = socket->len; 885 void *pbuf = socket->buf; 886 socket->input = NULL; 887 socket->len = 0; 888 socket->buf = NULL; 587 889 if ((addr != NULL) && (alen != NULL)) { 588 890 int sz = *alen; 589 if (sz > sizeof( fp->psock->raddr4))590 sz = sizeof( fp->psock->raddr4);891 if (sz > sizeof(socket->raddr4)) 892 sz = sizeof(socket->raddr4); 591 893 memcpy(addr, raddr, sz); 592 894 *alen = sz; … … 611 913 } 612 914 case AF_INET6: { 613 return -EAFNOSUPPORT; 614 } 915 switch (socket->type) { 916 case SOCK_STREAM: { 917 if (flags & MSG_OOB) { 918 ret = tcp6_rcv_oob(socket->cepid, buf, len); 919 if (ret < 0) { 920 syslog(LOG_ERROR, "tcp6_rcv_oob => %d", ret); 921 return -ECOMM; 922 } 923 } 924 else { 925 int rsz, tmp; 926 if (socket->input == NULL) { 927 ret = wai_sem(SEM_FILEDESC); 928 if (ret < 0) { 929 syslog(LOG_ERROR, "wai_sem => %d", ret); 930 } 931 socket->len = 0; 932 ret = sig_sem(SEM_FILEDESC); 933 if (ret < 0) { 934 syslog(LOG_ERROR, "sig_sem => %d", ret); 935 } 936 ret = tcp6_rcv_buf(socket->cepid, &socket->input, TMO_FEVR); 937 if (ret < 0) { 938 syslog(LOG_ERROR, "tcp6_rcv_buf => %d", ret); 939 return -ECOMM; 940 } 941 rsz = ret; 942 } 943 else 944 rsz = socket->len; 945 tmp = rsz; 946 if (rsz > len) 947 rsz = len; 948 if (rsz >= 0) { 949 memcpy(buf, socket->input, rsz); 950 ret = wai_sem(SEM_FILEDESC); 951 if (ret < 0) { 952 syslog(LOG_ERROR, "wai_sem => %d", ret); 953 } 954 socket->len = tmp - rsz; 955 ret = sig_sem(SEM_FILEDESC); 956 if (ret < 0) { 957 syslog(LOG_ERROR, "sig_sem => %d", ret); 958 } 959 if (tmp - rsz == 0) { 960 socket->input = NULL; 961 } 962 else 963 socket->input = (void *)&((uint8_t *)socket->input)[rsz]; 964 ret = tcp6_rel_buf(socket->cepid, rsz); 965 if ((ret != E_OBJ) && (ret < 0)) { 966 syslog(LOG_ERROR, "tcp6_rel_buf => %d", ret); 967 //return -ECOMM; 968 } 969 } 970 ret = rsz; 971 } 972 break; 973 } 974 case SOCK_DGRAM: { 975 struct sockaddr_in6 *raddr = &socket->raddr6; 976 int rsz; 977 ret = wai_sem(SEM_FILEDESC); 978 if (ret < 0) { 979 syslog(LOG_ERROR, "wai_sem => %d", ret); 980 } 981 T_NET_BUF *input = socket->input; 982 if (input == NULL) { 983 ret = sig_sem(SEM_FILEDESC); 984 if (ret < 0) { 985 syslog(LOG_ERROR, "sig_sem => %d", ret); 986 } 987 988 T_IPV6EP rep = { 0, 0 }; 989 ret = udp6_rcv_dat(socket->cepid, &rep, buf, len, 990 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 991 if (ret < 0) { 992 if ((socket->flags & O_NONBLOCK) == 0) 993 syslog(LOG_ERROR, "udp6_rcv_buf => %d", ret); 994 return (ret == E_TMOUT) ? -ETIME : -ECOMM; 995 } 996 rsz = ret; 997 if ((addr != NULL) && (alen != NULL)) { 998 ret = wai_sem(SEM_FILEDESC); 999 if (ret < 0) { 1000 syslog(LOG_ERROR, "wai_sem => %d", ret); 1001 } 1002 int sz = *alen; 1003 memset(raddr, 0, sizeof(socket->raddr6)); 1004 raddr->sin6_family = AF_INET; 1005 raddr->sin6_port = htons(rep.portno); 1006 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN 1007 memcpy(raddr->sin6_addr.__in6_union.__s6_addr, rep.ipaddr.__u6_addr.__u6_addr8, 16); 1008 #else 1009 for (int i = 0; i < 16; i++) 1010 raddr->sin6_addr.__in6_union.__s6_addr[i] = rep.ipaddr.__u6_addr.__u6_addr8[i]; 1011 #endif 1012 if (sz > sizeof(socket->raddr6)) 1013 sz = sizeof(socket->raddr6); 1014 memcpy(addr, raddr, sz); 1015 *alen = sz; 1016 ret = sig_sem(SEM_FILEDESC); 1017 if (ret < 0) { 1018 syslog(LOG_ERROR, "sig_sem => %d", ret); 1019 } 1020 } 1021 } 1022 else { 1023 rsz = socket->len; 1024 void *pbuf = socket->buf; 1025 socket->input = NULL; 1026 socket->len = 0; 1027 socket->buf = NULL; 1028 if ((addr != NULL) && (alen != NULL)) { 1029 int sz = *alen; 1030 if (sz > sizeof(socket->raddr6)) 1031 sz = sizeof(socket->raddr6); 1032 memcpy(addr, raddr, sz); 1033 *alen = sz; 1034 } 1035 ret = sig_sem(SEM_FILEDESC); 1036 if (ret < 0) { 1037 syslog(LOG_ERROR, "sig_sem => %d", ret); 1038 } 1039 if (rsz > len) 1040 rsz = len; 1041 memcpy(buf, pbuf, rsz); 1042 ret = rel_net_buf(input); 1043 if (ret < 0) { 1044 syslog(LOG_ERROR, "rel_net_buf => %d", ret); 1045 //return -ECOMM; 1046 } 1047 } 1048 ret = rsz; 1049 } 1050 } 1051 break; 1052 } 1053 default: 1054 return -ENOPROTOOPT; 615 1055 } 616 1056 … … 632 1072 633 1073 ER ret; 634 switch (fp->psock->family) { 1074 socket_t *socket = (socket_t *)fp->exinf; 1075 switch (socket->family) { 635 1076 case AF_INET: { 636 switch ( fp->psock->type) {1077 switch (socket->type) { 637 1078 case SOCK_STREAM: { 638 ret = tcp_sht_cep( fp->psock->cepid);1079 ret = tcp_sht_cep(socket->cepid); 639 1080 if (ret < 0) { 640 1081 return -ECOMM; … … 646 1087 } 647 1088 case AF_INET6: { 648 return -EAFNOSUPPORT; 649 } 1089 switch (socket->type) { 1090 case SOCK_STREAM: { 1091 ret = tcp6_sht_cep(socket->cepid); 1092 if (ret < 0) { 1093 return -ECOMM; 1094 } 1095 break; 1096 } 1097 } 1098 break; 1099 } 1100 default: 1101 return -ENOPROTOOPT; 650 1102 } 651 1103 … … 661 1113 662 1114 ER ret; 663 switch (fp->psock->family) { 1115 socket_t *socket = (socket_t *)fp->exinf; 1116 switch (socket->family) { 664 1117 case AF_INET: { 665 switch ( fp->psock->type) {1118 switch (socket->type) { 666 1119 case SOCK_STREAM: { 667 1120 switch (level) { … … 669 1122 switch (optname) { 670 1123 case SO_REUSEADDR: 671 if ( fp->psock->flags & SO_REUSEADDR) {1124 if (socket->flags & SO_REUSEADDR) { 672 1125 *(bool *)optval = true; 673 1126 } … … 677 1130 break; 678 1131 case SO_KEEPALIVE: 679 if ( fp->psock->flags & SO_KEEPALIVE) {1132 if (socket->flags & SO_KEEPALIVE) { 680 1133 *(bool *)optval = true; 681 1134 } … … 692 1145 break; 693 1146 case IPPROTO_TCP: 694 ret = tcp_get_opt( fp->psock->cepid, optname, (void *)optval, *optlen);1147 ret = tcp_get_opt(socket->cepid, optname, (void *)optval, *optlen); 695 1148 if (ret < 0) { 696 1149 return -EINVAL; … … 706 1159 switch (level) { 707 1160 case IPPROTO_UDP: 708 ret = udp_get_opt( fp->psock->cepid, optname, (void *)optval, *optlen);1161 ret = udp_get_opt(socket->cepid, optname, (void *)optval, *optlen); 709 1162 if (ret < 0) { 710 1163 return -EINVAL; … … 721 1174 } 722 1175 case AF_INET6: { 723 return -EAFNOSUPPORT; 724 } 1176 switch (socket->type) { 1177 case SOCK_STREAM: { 1178 switch (level) { 1179 case SOL_SOCKET: 1180 switch (optname) { 1181 case SO_REUSEADDR: 1182 if (socket->flags & SO_REUSEADDR) { 1183 *(bool *)optval = true; 1184 } 1185 else { 1186 *(bool *)optval = false; 1187 } 1188 break; 1189 case SO_KEEPALIVE: 1190 if (socket->flags & SO_KEEPALIVE) { 1191 *(bool *)optval = true; 1192 } 1193 else { 1194 *(bool *)optval = false; 1195 } 1196 break; 1197 case SO_ERROR: 1198 *(int *)optval = 0; 1199 break; 1200 default: 1201 return -EINVAL; 1202 } 1203 break; 1204 case IPPROTO_TCP: 1205 ret = tcp6_get_opt(socket->cepid, optname, (void *)optval, *optlen); 1206 if (ret < 0) { 1207 return -EINVAL; 1208 } 1209 *optlen = ret; 1210 break; 1211 default: 1212 return -EINVAL; 1213 } 1214 break; 1215 } 1216 case SOCK_DGRAM: { 1217 switch (level) { 1218 case IPPROTO_UDP: 1219 ret = udp6_get_opt(socket->cepid, optname, (void *)optval, *optlen); 1220 if (ret < 0) { 1221 return -EINVAL; 1222 } 1223 *optlen = ret; 1224 break; 1225 default: 1226 return -EINVAL; 1227 } 1228 break; 1229 } 1230 } 1231 break; 1232 } 1233 default: 1234 return -ENOPROTOOPT; 725 1235 } 726 1236 … … 736 1246 737 1247 ER ret; 738 switch (fp->psock->family) { 1248 socket_t *socket = (socket_t *)fp->exinf; 1249 switch (socket->family) { 739 1250 case AF_INET: { 740 switch ( fp->psock->type) {1251 switch (socket->type) { 741 1252 case SOCK_STREAM: { 742 1253 switch (level){ … … 745 1256 case SO_REUSEADDR: 746 1257 if (*(bool *)optval) { 747 fp->psock->flags |= SO_REUSEADDR;1258 socket->flags |= SO_REUSEADDR; 748 1259 } 749 1260 else { 750 fp->psock->flags &= ~SO_REUSEADDR;1261 socket->flags &= ~SO_REUSEADDR; 751 1262 } 752 1263 break; 753 1264 case SO_KEEPALIVE: 754 1265 if (*(bool *)optval) { 755 fp->psock->flags |= SO_KEEPALIVE;1266 socket->flags |= SO_KEEPALIVE; 756 1267 } 757 1268 else { 758 fp->psock->flags &= ~SO_KEEPALIVE;1269 socket->flags &= ~SO_KEEPALIVE; 759 1270 } 760 1271 break; … … 764 1275 break; 765 1276 case IPPROTO_TCP: 766 ret = tcp_set_opt( fp->psock->cepid, optname, (void *)optval, optlen);1277 ret = tcp_set_opt(socket->cepid, optname, (void *)optval, optlen); 767 1278 if (ret < 0) { 768 1279 return -EINVAL; … … 777 1288 switch (level){ 778 1289 case IPPROTO_UDP: 779 ret = udp_set_opt( fp->psock->cepid, optname, (void *)optval, optlen);1290 ret = udp_set_opt(socket->cepid, optname, (void *)optval, optlen); 780 1291 if (ret < 0) { 781 1292 return -EINVAL; … … 791 1302 } 792 1303 case AF_INET6: { 793 return -EAFNOSUPPORT; 794 } 1304 switch (socket->type) { 1305 case SOCK_STREAM: { 1306 switch (level){ 1307 case SOL_SOCKET: 1308 switch (optname) { 1309 case SO_REUSEADDR: 1310 if (*(bool *)optval) { 1311 socket->flags |= SO_REUSEADDR; 1312 } 1313 else { 1314 socket->flags &= ~SO_REUSEADDR; 1315 } 1316 break; 1317 case SO_KEEPALIVE: 1318 if (*(bool *)optval) { 1319 socket->flags |= SO_KEEPALIVE; 1320 } 1321 else { 1322 socket->flags &= ~SO_KEEPALIVE; 1323 } 1324 break; 1325 default: 1326 return -EINVAL; 1327 } 1328 break; 1329 case IPPROTO_TCP: 1330 ret = tcp6_set_opt(socket->cepid, optname, (void *)optval, optlen); 1331 if (ret < 0) { 1332 return -EINVAL; 1333 } 1334 break; 1335 default: 1336 return -EINVAL; 1337 } 1338 break; 1339 } 1340 case SOCK_DGRAM: { 1341 switch (level){ 1342 case IPPROTO_UDP: 1343 ret = udp6_set_opt(socket->cepid, optname, (void *)optval, optlen); 1344 if (ret < 0) { 1345 return -EINVAL; 1346 } 1347 break; 1348 default: 1349 return -EINVAL; 1350 } 1351 break; 1352 } 1353 } 1354 break; 1355 } 1356 default: 1357 return -ENOPROTOOPT; 795 1358 } 796 1359 … … 809 1372 810 1373 socklen_t size = *len; 811 switch (fp->psock->family) { 1374 socket_t *socket = (socket_t *)fp->exinf; 1375 switch (socket->family) { 812 1376 case AF_INET: { 813 struct sockaddr_in *raddr = & fp->psock->raddr4;1377 struct sockaddr_in *raddr = &socket->raddr4; 814 1378 *len = sizeof(struct sockaddr_in); 815 1379 if (size > sizeof(struct sockaddr_in)) … … 819 1383 } 820 1384 case AF_INET6: { 821 return -EAFNOSUPPORT; 822 } 1385 struct sockaddr_in6 *raddr = &socket->raddr6; 1386 *len = sizeof(struct sockaddr_in6); 1387 if (size > sizeof(struct sockaddr_in6)) 1388 size = sizeof(struct sockaddr_in6); 1389 memcpy(addr, raddr, size); 1390 break; 1391 } 1392 default: 1393 return -ENOPROTOOPT; 823 1394 } 824 1395 … … 837 1408 838 1409 socklen_t size = *len; 839 switch (fp->psock->family) { 1410 socket_t *socket = (socket_t *)fp->exinf; 1411 switch (socket->family) { 840 1412 case AF_INET: { 841 1413 const T_IN4_ADDR *laddr4 = in4_get_ifaddr(0); … … 843 1415 laddr.sin_family = AF_INET; 844 1416 laddr.sin_addr.s_addr = htonl(*laddr4); 845 laddr.sin_port = fp->psock->laddr4.sin_port;1417 laddr.sin_port = socket->laddr4.sin_port; 846 1418 memset(&laddr.sin_zero, 0, sizeof(laddr.sin_zero)); 847 1419 *len = sizeof(struct sockaddr_in); … … 852 1424 } 853 1425 case AF_INET6: { 854 return -EAFNOSUPPORT; 855 } 1426 const T_IN6_ADDR *laddr6 = in6_get_ifaddr(0); 1427 struct sockaddr_in6 laddr; 1428 laddr.sin6_family = AF_INET; 1429 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN 1430 memcpy(laddr.sin6_addr.__in6_union.__s6_addr, laddr6->__u6_addr.__u6_addr8, 16); 1431 #else 1432 for (int i = 0; i < 16; i++) 1433 laddr.sin6_addr.__in6_union.__s6_addr[i] = laddr6->__u6_addr.__u6_addr8[i]; 1434 #endif 1435 laddr.sin6_port = socket->laddr6.sin6_port; 1436 *len = sizeof(struct sockaddr_in6); 1437 if (size > sizeof(struct sockaddr_in6)) 1438 size = sizeof(struct sockaddr_in6); 1439 memcpy(addr, &laddr, size); 1440 break; 1441 } 1442 default: 1443 return -ENOPROTOOPT; 856 1444 } 857 1445 … … 859 1447 } 860 1448 861 int tcp_fd_close(struct _IO_FILE *fp)1449 int tcp_fd_close(struct SHELL_FILE *fp) 862 1450 { 863 1451 ER ret, ret2; 864 1452 865 switch (fp->psock->family) { 1453 socket_t *socket = (socket_t *)fp->exinf; 1454 switch (socket->family) { 866 1455 case AF_INET: { 867 if ( fp->psock->cepid != 0) {868 ID cepid = fp->psock->cepid;1456 if (socket->cepid != 0) { 1457 ID cepid = socket->cepid; 869 1458 ret = tcp_sht_cep(cepid); 870 1459 if (ret < 0) { 871 1460 //return -1; 872 1461 } 873 ret = tcp_cls_cep(cepid, ( fp->psock->repid != 0) ? 0 : SOCKET_TIMEOUT);1462 ret = tcp_cls_cep(cepid, (socket->repid != 0) ? 0 : SOCKET_TIMEOUT); 874 1463 ret2 = tcp_del_cep(cepid); 875 free(fp->psock->buf); 876 fp->psock->buf = NULL; 877 delete_tcp_fd(cepid); 1464 //delete_fd_by_id(&IO_TYPE_TCP, cepid); 878 1465 delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid); 879 1466 if ((ret < 0) || (ret2 < 0)) { … … 881 1468 } 882 1469 } 883 else if ( fp->psock->repid != 0) {884 ID repid = fp->psock->repid;1470 else if (socket->repid != 0) { 1471 ID repid = socket->repid; 885 1472 ret = tcp_del_rep(repid); 886 free(fp->psock->buf); 887 fp->psock->buf = NULL; 888 delete_tcp_fd(tmax_tcp_cepid + repid); 1473 //delete_fd_by_id(&IO_TYPE_TCP, tmax_tcp_cepid + repid); 889 1474 delete_id(tcp_repid_table, tcp_repid_table_count, repid); 890 1475 if (ret < 0) { … … 893 1478 } 894 1479 else { 895 free(fp->psock->buf);896 fp->psock->buf = NULL;897 1480 return -EINVAL; 898 1481 } … … 900 1483 } 901 1484 case AF_INET6: { 902 return -EAFNOSUPPORT; 903 } 1485 if (socket->cepid != 0) { 1486 ID cepid = socket->cepid; 1487 ret = tcp6_sht_cep(cepid); 1488 if (ret < 0) { 1489 //return -1; 1490 } 1491 ret = tcp6_cls_cep(cepid, (socket->repid != 0) ? 0 : SOCKET_TIMEOUT); 1492 ret2 = tcp6_del_cep(cepid); 1493 //delete_fd_by_id(&IO_TYPE_TCP, cepid); 1494 delete_id(tcp6_cepid_table, tcp6_cepid_table_count, cepid); 1495 if ((ret < 0) || (ret2 < 0)) { 1496 return (ret == E_TMOUT) ? -ETIME : -EINVAL; 1497 } 1498 } 1499 else if (socket->repid != 0) { 1500 ID repid = socket->repid; 1501 ret = tcp6_del_rep(repid); 1502 //delete_fd_by_id(&IO_TYPE_TCP, tmax_tcp6_cepid + repid); 1503 delete_id(tcp6_repid_table, tcp6_repid_table_count, repid); 1504 if (ret < 0) { 1505 return -EINVAL; 1506 } 1507 } 1508 else { 1509 return -EINVAL; 1510 } 1511 break; 1512 } 1513 default: 1514 return -ENOPROTOOPT; 904 1515 } 905 1516 … … 907 1518 } 908 1519 909 size_t tcp_fd_read(struct _IO_FILE *fp, unsigned char *dst, size_t dstsz)1520 size_t tcp_fd_read(struct SHELL_FILE *fp, unsigned char *dst, size_t dstsz) 910 1521 { 911 1522 return shell_recvfrom(fp->fd, dst, dstsz, 0, NULL, NULL); 912 1523 } 913 1524 914 size_t tcp_fd_write(struct _IO_FILE *fp, const unsigned char *src, size_t srcsz)1525 size_t tcp_fd_write(struct SHELL_FILE *fp, const unsigned char *src, size_t srcsz) 915 1526 { 916 1527 return shell_sendto(fp->fd, src, srcsz, 0, NULL, 0); 917 1528 } 918 1529 919 off_t tcp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org)1530 off_t tcp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org) 920 1531 { 921 1532 return -EPERM; 922 1533 } 923 1534 924 int tcp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg)1535 int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg) 925 1536 { 926 1537 return -EINVAL; 927 1538 } 928 1539 929 int udp_fd_close(struct _IO_FILE *fp) 1540 bool_t tcp_fd_readable(struct SHELL_FILE *fp) 1541 { 1542 ER ret; 1543 1544 socket_t *socket = (socket_t *)fp->exinf; 1545 if (socket->cepid != 0) { 1546 if (socket->len == 0) { 1547 ret = tcp_rcv_buf(socket->cepid, &socket->input, TMO_NBLK); 1548 if ((ret != E_WBLK) && (ret != E_OBJ) && (ret < 0)) { 1549 syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret); 1550 //return ret; 1551 } 1552 if (ret > 0) { 1553 ret = wai_sem(SEM_FILEDESC); 1554 if (ret < 0) { 1555 syslog(LOG_ERROR, "wai_sem => %d", ret); 1556 } 1557 socket->len += ret; 1558 ret = sig_sem(SEM_FILEDESC); 1559 if (ret < 0) { 1560 syslog(LOG_ERROR, "sig_sem => %d", ret); 1561 } 1562 } 1563 } 1564 else ret = 1; 1565 if (ret > 0) { 1566 return true; 1567 } 1568 } 1569 1570 return false; 1571 } 1572 1573 void tcp_fd_delete(struct SHELL_FILE *fp) 1574 { 1575 socket_t *socket = (socket_t *)fp->exinf; 1576 free(socket->buf); 1577 socket->buf = NULL; 1578 free(fp->exinf); 1579 fp->exinf = NULL; 1580 } 1581 1582 ER socket_tcp_callback(ID cepid, FN fncd, void *p_parblk) 1583 { 1584 struct SHELL_FILE *fp = id_to_fd(&IO_TYPE_TCP, cepid); 1585 FLGPTN flgptn = 0; 1586 ER ret; 1587 int len; 1588 1589 if (fp == NULL) 1590 return E_PAR; 1591 1592 int fd = fp->fd; 1593 FD_SET(fd, (fd_set *)&flgptn); 1594 1595 switch (fncd) { 1596 case TFN_TCP_RCV_BUF: 1597 len = *(int *)p_parblk; 1598 if ((len <= 0) || (fp->exinf == NULL)) 1599 return E_OK; 1600 1601 ret = wai_sem(SEM_FILEDESC); 1602 if (ret < 0) { 1603 syslog(LOG_ERROR, "wai_sem => %d", ret); 1604 } 1605 socket_t *socket = (socket_t *)fp->exinf; 1606 socket->len += len; 1607 ret = sig_sem(SEM_FILEDESC); 1608 if (ret < 0) { 1609 syslog(LOG_ERROR, "sig_sem => %d", ret); 1610 } 1611 1612 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1613 1614 set_flg(FLG_SELECT_WAIT, flgptn); 1615 return E_OK; 1616 1617 case TFN_TCP_RCV_DAT: 1618 len = *(int *)p_parblk; 1619 if ((len <= 0) || (fp->exinf == NULL)) 1620 return E_OK; 1621 1622 ret = wai_sem(SEM_FILEDESC); 1623 if (ret < 0) { 1624 syslog(LOG_ERROR, "wai_sem => %d", ret); 1625 } 1626 socket->len += len; 1627 ret = sig_sem(SEM_FILEDESC); 1628 if (ret < 0) { 1629 syslog(LOG_ERROR, "sig_sem => %d", ret); 1630 } 1631 1632 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1633 1634 set_flg(FLG_SELECT_WAIT, flgptn); 1635 return E_OK; 1636 1637 case TFN_TCP_SND_DAT: 1638 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++; 1639 1640 set_flg(FLG_SELECT_WAIT, flgptn); 1641 return E_OK; 1642 1643 case TFN_TCP_CAN_CEP: 1644 if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++; 1645 1646 set_flg(FLG_SELECT_WAIT, flgptn); 1647 return E_OK; 1648 1649 case TFN_TCP_DEL_REP: 1650 delete_fd_by_id(&IO_TYPE_TCP, tmax_tcp_cepid + cepid); 1651 return E_OK; 1652 1653 case TFN_TCP_DEL_CEP: 1654 delete_fd_by_id(&IO_TYPE_TCP, cepid); 1655 return E_OK; 1656 1657 default: 1658 return E_OK; 1659 } 1660 } 1661 1662 ER socket_tcp6_callback(ID cepid, FN fncd, void *p_parblk) 1663 { 1664 struct SHELL_FILE *fp = id_to_fd(&IO_TYPE_TCP, cepid); 1665 FLGPTN flgptn = 0; 1666 ER ret; 1667 int len; 1668 1669 if (fp == NULL) 1670 return E_PAR; 1671 1672 int fd = fp->fd; 1673 FD_SET(fd, (fd_set *)&flgptn); 1674 1675 switch (fncd) { 1676 case TFN_TCP_RCV_BUF: 1677 len = *(int *)p_parblk; 1678 if ((len <= 0) || (fp->exinf == NULL)) 1679 return E_OK; 1680 1681 ret = wai_sem(SEM_FILEDESC); 1682 if (ret < 0) { 1683 syslog(LOG_ERROR, "wai_sem => %d", ret); 1684 } 1685 socket_t *socket = (socket_t *)fp->exinf; 1686 socket->len += len; 1687 ret = sig_sem(SEM_FILEDESC); 1688 if (ret < 0) { 1689 syslog(LOG_ERROR, "sig_sem => %d", ret); 1690 } 1691 1692 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1693 1694 set_flg(FLG_SELECT_WAIT, flgptn); 1695 return E_OK; 1696 1697 case TFN_TCP_RCV_DAT: 1698 len = *(int *)p_parblk; 1699 if ((len <= 0) || (fp->exinf == NULL)) 1700 return E_OK; 1701 1702 ret = wai_sem(SEM_FILEDESC); 1703 if (ret < 0) { 1704 syslog(LOG_ERROR, "wai_sem => %d", ret); 1705 } 1706 socket->len += len; 1707 ret = sig_sem(SEM_FILEDESC); 1708 if (ret < 0) { 1709 syslog(LOG_ERROR, "sig_sem => %d", ret); 1710 } 1711 1712 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1713 1714 set_flg(FLG_SELECT_WAIT, flgptn); 1715 return E_OK; 1716 1717 case TFN_TCP_SND_DAT: 1718 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++; 1719 1720 set_flg(FLG_SELECT_WAIT, flgptn); 1721 return E_OK; 1722 1723 case TFN_TCP_CAN_CEP: 1724 if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++; 1725 1726 set_flg(FLG_SELECT_WAIT, flgptn); 1727 return E_OK; 1728 1729 case TFN_TCP_DEL_REP: 1730 delete_fd_by_id(&IO_TYPE_TCP, tmax_tcp_cepid + cepid); 1731 return E_OK; 1732 1733 case TFN_TCP_DEL_CEP: 1734 delete_fd_by_id(&IO_TYPE_TCP, cepid); 1735 return E_OK; 1736 1737 default: 1738 return E_OK; 1739 } 1740 } 1741 1742 int udp_fd_close(struct SHELL_FILE *fp) 930 1743 { 931 1744 ER ret; 932 1745 ID cepid; 933 1746 934 switch (fp->psock->family) { 1747 socket_t *socket = (socket_t *)fp->exinf; 1748 switch (socket->family) { 935 1749 case AF_INET: { 936 cepid = fp->psock->cepid;1750 cepid = socket->cepid; 937 1751 ret = udp_del_cep(cepid); 938 //free(fp->psock->buf); 939 //fp->psock->buf = NULL; 940 delete_udp_fd(cepid); 1752 //delete_fd_by_id(&IO_TYPE_UDP, cepid); 941 1753 delete_id(udp_cepid_table, udp_cepid_table_count, cepid); 942 1754 if (ret < 0) { … … 946 1758 } 947 1759 case AF_INET6: { 948 return -EAFNOSUPPORT; 949 } 1760 cepid = socket->cepid; 1761 ret = udp6_del_cep(cepid); 1762 //delete_fd_by_id(&IO_TYPE_UDP, cepid); 1763 delete_id(udp6_cepid_table, udp6_cepid_table_count, cepid); 1764 if (ret < 0) { 1765 return -EINVAL; 1766 } 1767 break; 1768 } 1769 default: 1770 return -ENOPROTOOPT; 950 1771 } 951 1772 … … 953 1774 } 954 1775 955 size_t udp_fd_read(struct _IO_FILE *fp, unsigned char *dst, size_t dstsz)1776 size_t udp_fd_read(struct SHELL_FILE *fp, unsigned char *dst, size_t dstsz) 956 1777 { 957 1778 return shell_recvfrom(fp->fd, dst, dstsz, 0, NULL, NULL); 958 1779 } 959 1780 960 size_t udp_fd_write(struct _IO_FILE *fp, const unsigned char *src, size_t srcsz)1781 size_t udp_fd_write(struct SHELL_FILE *fp, const unsigned char *src, size_t srcsz) 961 1782 { 962 1783 return shell_sendto(fp->fd, src, srcsz, 0, NULL, 0); 963 1784 } 964 1785 965 off_t udp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org)1786 off_t udp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org) 966 1787 { 967 1788 return -EPERM; 968 1789 } 969 1790 970 int udp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg)1791 int udp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg) 971 1792 { 972 1793 return -EINVAL; 1794 } 1795 1796 bool_t udp_fd_readable(struct SHELL_FILE *fp) 1797 { 1798 socket_t *socket = (socket_t *)fp->exinf; 1799 if (socket->cepid != 0) { 1800 if (socket->input != NULL) { 1801 return true; 1802 } 1803 } 1804 1805 return false; 1806 } 1807 1808 void udp_fd_delete(struct SHELL_FILE *fp) 1809 { 1810 //socket_t *socket = (socket_t *)fp->exinf; 1811 //free(socket->buf); 1812 //socket->buf = NULL; 1813 free(fp->exinf); 1814 fp->exinf = NULL; 1815 } 1816 1817 ER socket_udp_callback(ID cepid, FN fncd, void *p_parblk) 1818 { 1819 struct SHELL_FILE *fp = id_to_fd(&IO_TYPE_UDP, cepid); 1820 FLGPTN flgptn = 0; 1821 int len; 1822 1823 if (fp == NULL) 1824 return E_PAR; 1825 1826 int fd = fp->fd; 1827 FD_SET(fd, (fd_set *)&flgptn); 1828 1829 switch (fncd) { 1830 case TEV_UDP_RCV_DAT: 1831 { 1832 T_UDP_RCV_DAT_PARA *udppara = (T_UDP_RCV_DAT_PARA *)p_parblk; 1833 len = udppara->len; 1834 if ((len <= 0) || (fp->exinf == NULL)) 1835 return E_OK; 1836 1837 ER ret = wai_sem(SEM_FILEDESC); 1838 if (ret < 0) { 1839 syslog(LOG_ERROR, "wai_sem => %d", ret); 1840 } 1841 socket_t *socket = (socket_t *)fp->exinf; 1842 socket->len = len; 1843 if (socket->input != NULL) { 1844 ret = rel_net_buf(socket->input); 1845 if (ret < 0) { 1846 syslog(LOG_ERROR, "rel_net_buf => %d", ret); 1847 } 1848 } 1849 socket->input = udppara->input; 1850 socket->buf = GET_UDP_SDU(udppara->input, udppara->off); 1851 memset(&socket->raddr4, 0, sizeof(socket->raddr4)); 1852 socket->raddr4.sin_family = AF_INET; 1853 socket->raddr4.sin_port = htons(udppara->rep4.portno); 1854 socket->raddr4.sin_addr.s_addr = htonl(udppara->rep4.ipaddr); 1855 udppara->input->flags |= NB_FLG_NOREL_IFOUT; 1856 ret = sig_sem(SEM_FILEDESC); 1857 if (ret < 0) { 1858 syslog(LOG_ERROR, "sig_sem => %d", ret); 1859 } 1860 1861 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1862 1863 set_flg(FLG_SELECT_WAIT, flgptn); 1864 return E_OK; 1865 } 1866 case TFN_UDP_CRE_CEP: 1867 return E_OK; 1868 1869 case TFN_UDP_RCV_DAT: 1870 len = *(int *)p_parblk; 1871 if ((len <= 0) || (fp->exinf == NULL)) 1872 return E_OK; 1873 1874 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1875 1876 set_flg(FLG_SELECT_WAIT, flgptn); 1877 return E_OK; 1878 1879 case TFN_UDP_SND_DAT: 1880 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++; 1881 1882 set_flg(FLG_SELECT_WAIT, flgptn); 1883 return E_OK; 1884 1885 case TFN_UDP_CAN_CEP: 1886 if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++; 1887 1888 set_flg(FLG_SELECT_WAIT, flgptn); 1889 return E_OK; 1890 1891 case TFN_UDP_DEL_CEP: 1892 delete_fd_by_id(&IO_TYPE_UDP, cepid); 1893 return E_OK; 1894 1895 default: 1896 return E_OK; 1897 } 1898 } 1899 1900 ER socket_udp6_callback(ID cepid, FN fncd, void *p_parblk) 1901 { 1902 struct SHELL_FILE *fp = id_to_fd(&IO_TYPE_UDP, cepid); 1903 FLGPTN flgptn = 0; 1904 int len; 1905 1906 if (fp == NULL) 1907 return E_PAR; 1908 1909 int fd = fp->fd; 1910 FD_SET(fd, (fd_set *)&flgptn); 1911 1912 switch (fncd) { 1913 case TEV_UDP_RCV_DAT: 1914 { 1915 T_UDP_RCV_DAT_PARA *udppara = (T_UDP_RCV_DAT_PARA *)p_parblk; 1916 len = udppara->len; 1917 if ((len <= 0) || (fp->exinf == NULL)) 1918 return E_OK; 1919 1920 ER ret = wai_sem(SEM_FILEDESC); 1921 if (ret < 0) { 1922 syslog(LOG_ERROR, "wai_sem => %d", ret); 1923 } 1924 socket_t *socket = (socket_t *)fp->exinf; 1925 socket->len = len; 1926 if (socket->input != NULL) { 1927 ret = rel_net_buf(socket->input); 1928 if (ret < 0) { 1929 syslog(LOG_ERROR, "rel_net_buf => %d", ret); 1930 } 1931 } 1932 socket->input = udppara->input; 1933 socket->buf = GET_UDP_SDU(udppara->input, udppara->off); 1934 memset(&socket->raddr6, 0, sizeof(socket->raddr6)); 1935 socket->raddr6.sin6_family = AF_INET; 1936 socket->raddr6.sin6_port = htons(udppara->rep6.portno); 1937 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN 1938 memcpy(socket->raddr6.sin6_addr.__in6_union.__s6_addr, udppara->rep6.ipaddr.__u6_addr.__u6_addr8, 16); 1939 #else 1940 for (int i = 0; i < 16; i++) 1941 socket->raddr6.sin6_addr.__in6_union.__s6_addr[i] = udppara->rep6.ipaddr.__u6_addr.__u6_addr8[i]; 1942 #endif 1943 udppara->input->flags |= NB_FLG_NOREL_IFOUT; 1944 ret = sig_sem(SEM_FILEDESC); 1945 if (ret < 0) { 1946 syslog(LOG_ERROR, "sig_sem => %d", ret); 1947 } 1948 1949 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1950 1951 set_flg(FLG_SELECT_WAIT, flgptn); 1952 return E_OK; 1953 } 1954 case TFN_UDP_CRE_CEP: 1955 return E_OK; 1956 1957 case TFN_UDP_RCV_DAT: 1958 len = *(int *)p_parblk; 1959 if ((len <= 0) || (fp->exinf == NULL)) 1960 return E_OK; 1961 1962 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1963 1964 set_flg(FLG_SELECT_WAIT, flgptn); 1965 return E_OK; 1966 1967 case TFN_UDP_SND_DAT: 1968 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++; 1969 1970 set_flg(FLG_SELECT_WAIT, flgptn); 1971 return E_OK; 1972 1973 case TFN_UDP_CAN_CEP: 1974 if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++; 1975 1976 set_flg(FLG_SELECT_WAIT, flgptn); 1977 return E_OK; 1978 1979 case TFN_UDP_DEL_CEP: 1980 delete_fd_by_id(&IO_TYPE_UDP, cepid); 1981 return E_OK; 1982 1983 default: 1984 return E_OK; 1985 } 973 1986 } 974 1987 -
asp3_tinet_ecnl_rx/trunk/ntshell/src/socket_stub.h
r364 r374 103 103 } socket_t; 104 104 105 struct _IO_DIR {106 DIR dir;105 struct SHELL_DIR { 106 FATFS_DIR dir; 107 107 struct dirent dirent; 108 108 }; 109 109 110 struct _IO_FILE { 110 typedef const struct io_type_s IO_TYPE; 111 112 struct SHELL_FILE { 111 113 int fd; 112 inttype;114 IO_TYPE *type; 113 115 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 *);119 116 int readevt_r; 120 117 int readevt_w; … … 124 121 int errorevt_r; 125 122 int errorevt_w; 126 union { 127 FIL *pfile; 128 struct _IO_DIR *pdir; 129 socket_t *psock; 130 }; 123 void *exinf; 124 }; 125 126 struct 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 *); 131 134 }; 132 135 … … 141 144 #endif 142 145 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); 146 struct SHELL_FILE *new_fp(IO_TYPE *type, int id, int writable); 147 int delete_fd_by_id(IO_TYPE *type, int id); 148 struct SHELL_FILE *fd_to_fp(int fd); 149 struct SHELL_FILE *id_to_fd(IO_TYPE *type, int id); 149 150 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); 151 int delete_fp(struct SHELL_FILE *fp); 204 152 void clean_fd(); 205 153 206 ER socket_tcp_callback(ID cepid, FN fncd, void *p_parblk); 207 ER socket_udp_callback(ID cepid, FN fncd, void *p_parblk); 154 void sys_tlsf_init(void); 208 155 209 156 #endif // !SOCKET_STUB_H -
asp3_tinet_ecnl_rx/trunk/ntshell/src/syscall.c
r364 r374 442 442 return no_implement("flock\n"); 443 443 } 444 445 long SYS_fchdir() 446 { 447 return no_implement("fchdir\n"); 448 } 449 450 long SYS_getegid32() 451 { 452 return no_implement("getegid32\n"); 453 } 454 455 long SYS_geteuid32() 456 { 457 return no_implement("geteuid32\n"); 458 } 459 460 long SYS_getgid32() 461 { 462 return no_implement("getgid32\n"); 463 } 464 465 long SYS_pipe2() 466 { 467 return no_implement("pipe2\n"); 468 } 469 470 long SYS_setgid32() 471 { 472 return no_implement("setgid32\n"); 473 } 474 475 long SYS_setpgid() 476 { 477 return no_implement("setpgid\n"); 478 } 479 480 long SYS_setsid() 481 { 482 return no_implement("setsid\n"); 483 } 484 485 long SYS_setuid32() 486 { 487 return no_implement("setuid32\n"); 488 } 489 490 long SYS_tgkill() 491 { 492 return no_implement("tgkill\n"); 493 }
Note:
See TracChangeset
for help on using the changeset viewer.