Changeset 331 for EcnlProtoTool/trunk/ntshell/src/socket_stub.c
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/ntshell/src/socket_stub.c
r321 r331 35 35 * @(#) $Id$ 36 36 */ 37 #include <sys/types.h> 38 #include <stdint.h> 39 #if 0 40 #include <sys/socket.h> 41 #include <sys/un.h> 42 #include <netinet/in.h> 43 #include <netinet/tcp.h> 44 #include <arpa/inet.h> 45 #include <netdb.h> 46 #endif 47 #include <fcntl.h> 48 #include "sys/unistd.h" 49 #include <stddef.h> 50 #include <string.h> 51 #include <stdlib.h> 37 #include "shellif.h" 52 38 #include <kernel.h> 53 39 #include <t_syslog.h> 54 40 #include <t_stdlib.h> 41 #include <string.h> 55 42 #include <sil.h> 56 #include <stdlib.h>57 #include <string.h>58 #include <stdio.h>59 43 #include <setjmp.h> 60 44 #include "syssvc/syslog.h" … … 74 58 #include "ff.h" 75 59 #include "socket_stub.h" 76 #define SO_REUSEADDR 2 60 61 #define SOCKET_TIMEOUT 2000000 77 62 78 63 typedef struct id_table_t { … … 107 92 } 108 93 109 return - 1;94 return -ENOMEM; 110 95 } 111 96 … … 120 105 return 0; 121 106 } 122 return - 1;107 return -EINVAL; 123 108 } 124 109 125 110 int delete_tcp_rep(int repid) 126 111 { 127 delete_tcp_fd(tmax_tcp_cepid + repid);112 return delete_tcp_fd(tmax_tcp_cepid + repid); 128 113 } 129 114 … … 145 130 typedef struct _IO_FILE SOCKET; 146 131 147 int s ocket(int family, int type, int protocol)132 int shell_socket(int family, int type, int protocol) 148 133 { 149 134 SOCKET *fp; 135 unsigned int flags; 150 136 151 137 switch (family) { … … 154 140 break; 155 141 default: 156 return -1; 157 } 142 return -EAFNOSUPPORT; 143 } 144 145 flags = type & (SOCK_CLOEXEC|SOCK_NONBLOCK); 146 type &= ~flags; 158 147 159 148 switch (type) { … … 165 154 break; 166 155 default: 167 return - 1;156 return -ENOPROTOOPT; 168 157 } 169 158 170 159 if (fp == NULL) { 171 return - 1;160 return -ENOMEM; 172 161 } 173 162 … … 175 164 fp->socket.type = type; 176 165 fp->socket.protocol = protocol; 166 fp->socket.flags = flags; 177 167 178 168 return fp->fd; 179 169 } 180 170 181 int bind(int fd, const struct sockaddr *addr, socklen_t len)171 int shell_bind(int fd, const struct sockaddr *addr, socklen_t len) 182 172 { 183 173 SOCKET *fp = fd_to_fp(fd); 184 if (fp == NULL) { 185 return -1; 186 } 187 188 if (fp->socket.family != addr->sa_family) { 189 return -1; 190 } 174 if (fp == NULL) 175 return -EBADF; 176 if (fp->socket.family != addr->sa_family) 177 return -EINVAL; 191 178 192 179 ER ret; … … 194 181 case AF_INET: { 195 182 if (len < 8) { 196 return - 1;183 return -EINVAL; 197 184 } 198 185 struct sockaddr_in *addr_in = (struct sockaddr_in *)addr; … … 202 189 ID cepid = new_id(tcp_cepid_table, tcp_cepid_table_count); 203 190 if (cepid < 0) 204 return - 1;191 return -ENOMEM; 205 192 206 193 fp->socket.buf_size = 512 + 512; 207 194 fp->socket.buf = id_to_buff(cepid); 208 T_TCP_CCEP ccep = { 0, fp->socket.buf, 512, &fp->socket.buf[512], 512, socket_tcp_callback };195 T_TCP_CCEP ccep = { 0, fp->socket.buf, 512, &fp->socket.buf[512], 512, (FP)socket_tcp_callback }; 209 196 ret = tcp_cre_cep(cepid, &ccep); 210 197 if (ret != E_OK) { 211 198 delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid); 212 return - 1;199 return -ENOMEM; 213 200 } 214 201 fp->handle = cepid; … … 219 206 ID cepid = new_id(udp_cepid_table, udp_cepid_table_count); 220 207 if (cepid < 0) 221 return - 1;222 223 T_UDP_CCEP ccep = { 0, {ntohl(addr_in->sin_addr.s_addr), ntohs(addr_in->sin_port)}, socket_udp_callback };208 return -ENOMEM; 209 210 T_UDP_CCEP ccep = { 0, {ntohl(addr_in->sin_addr.s_addr), ntohs(addr_in->sin_port)}, (FP)socket_udp_callback }; 224 211 ret = udp_cre_cep(cepid, &ccep); 225 212 if (ret != E_OK) { 226 213 delete_id(udp_cepid_table, udp_cepid_table_count, cepid); 227 return - 1;214 return -ENOMEM; 228 215 } 229 216 fp->handle = cepid; … … 232 219 } 233 220 default: 234 return - 1;221 return -ENOPROTOOPT; 235 222 } 236 223 break; … … 238 225 case AF_INET6: { 239 226 if (len < 20) { 240 return - 1;227 return -EINVAL; 241 228 } 242 229 memcpy(&fp->socket.laddr4, addr, len); … … 248 235 } 249 236 250 int listen(int fd, int backlog)237 int shell_listen(int fd, int backlog) 251 238 { 252 239 SOCKET *fp = fd_to_fp(fd); 253 if ((fp == NULL) || (fp->socket.type != SOCK_STREAM)) { 254 return -1; 255 } 240 if (fp == NULL) 241 return -EBADF; 242 if (fp->socket.type != SOCK_STREAM) 243 return -EINVAL; 256 244 257 245 fp->socket.backlog = backlog; … … 262 250 ID repid = new_id(tcp_repid_table, tcp_repid_table_count); 263 251 if (repid < 0) 264 return - 1;252 return -ENOMEM; 265 253 266 254 struct sockaddr_in *laddr = &fp->socket.laddr4; … … 269 257 if (ret != E_OK) { 270 258 delete_id(tcp_repid_table, tcp_repid_table_count, repid); 271 return - 1;259 return -ENOMEM; 272 260 } 273 261 fp->socket.repid = repid; … … 282 270 } 283 271 284 int connect(int fd, const struct sockaddr *addr, socklen_t len)272 int shell_connect(int fd, const struct sockaddr *addr, socklen_t len) 285 273 { 286 274 SOCKET *fp = fd_to_fp(fd); 287 if ((fp == NULL) || (fp->socket.type != SOCK_STREAM)) { 288 return -1; 289 } 275 if (fp == NULL) 276 return -EBADF; 277 if (fp->socket.type != SOCK_STREAM) 278 return -EINVAL; 290 279 291 280 ER ret; … … 293 282 case AF_INET: { 294 283 if (len < 8) { 295 return - 1;284 return -EINVAL; 296 285 } 297 286 if (fp->socket.cepid == 0) { 298 287 ID cepid = new_id(tcp_cepid_table, tcp_cepid_table_count); 299 288 if (cepid < 0) 300 return - 1;289 return -ENOMEM; 301 290 302 291 fp->socket.buf_size = 512 + 512; 303 292 fp->socket.buf = id_to_buff(cepid); 304 T_TCP_CCEP ccep = { 0, fp->socket.buf, 512, &fp->socket.buf[512], 512, socket_tcp_callback };293 T_TCP_CCEP ccep = { 0, fp->socket.buf, 512, &fp->socket.buf[512], 512, (FP)socket_tcp_callback }; 305 294 ret = tcp_cre_cep(cepid, &ccep); 306 295 if (ret != E_OK) { 307 296 delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid); 308 return - 1;297 return -ENOMEM; 309 298 } 310 299 fp->handle = cepid; … … 317 306 T_IPV4EP lep = { ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port) }; 318 307 T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) }; 319 ret = tcp_con_cep(fp->socket.cepid, &lep, &rep, TMO_FEVR);308 ret = tcp_con_cep(fp->socket.cepid, &lep, &rep, SOCKET_TIMEOUT); 320 309 if (ret < 0) { 321 return - 1;310 return -EHOSTUNREACH; 322 311 } 323 312 break; … … 331 320 } 332 321 333 int accept(int fd, struct sockaddr *addr, socklen_t *len)322 int shell_accept(int fd, struct sockaddr *__restrict addr, socklen_t *__restrict len) 334 323 { 335 324 SOCKET *lfp = fd_to_fp(fd); 336 if ((lfp == NULL) || (lfp->socket.type != SOCK_STREAM)) { 337 return -1; 338 } 325 if (lfp == NULL) 326 return -EBADF; 327 if (lfp->socket.type != SOCK_STREAM) 328 return -EINVAL; 339 329 340 330 SOCKET *fp = new_tcp_fd(0); 341 331 if (fp == NULL) { 342 return - 1;332 return -ENOMEM; 343 333 } 344 334 … … 352 342 cepid = new_id(tcp_cepid_table, tcp_cepid_table_count); 353 343 if (cepid < 0) 354 return - 1;344 return -ENOMEM; 355 345 356 346 fp->socket.buf_size = 512 + 512; 357 347 fp->socket.buf = id_to_buff(cepid); 358 T_TCP_CCEP ccep = { 0, fp->socket.buf, 512, &fp->socket.buf[512], 512, socket_tcp_callback };348 T_TCP_CCEP ccep = { 0, fp->socket.buf, 512, &fp->socket.buf[512], 512, (FP)socket_tcp_callback }; 359 349 ret = tcp_cre_cep(cepid, &ccep); 360 350 if (ret != E_OK) { 361 351 delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid); 362 return - 1;352 return -ENOMEM; 363 353 } 364 354 fp->handle = cepid; … … 375 365 ret = tcp_acp_cep(fp->socket.cepid, fp->socket.repid, &rep, TMO_FEVR); 376 366 if (ret < 0) { 377 return - 1;367 return -ENOMEM; 378 368 } 379 369 struct sockaddr_in *raddr = &fp->socket.raddr4; … … 385 375 } 386 376 case AF_INET6: { 387 break;377 return -EAFNOSUPPORT; 388 378 } 389 379 } … … 392 382 int sz = *len; 393 383 if (sz < 8) { 394 return - 1;384 return -EINVAL; 395 385 } 396 386 struct sockaddr_in *raddr = &fp->socket.raddr4; … … 404 394 } 405 395 406 ssize_t s end(int fd, const void *buf, size_t len, int flags)396 ssize_t shell_send(int fd, const void *buf, size_t len, int flags) 407 397 { 408 398 SOCKET *fp = fd_to_fp(fd); 409 399 if (fp == NULL) { 410 return - 1;400 return -EBADF; 411 401 } 412 402 … … 417 407 case SOCK_STREAM: { 418 408 if (flags & MSG_OOB) { 419 ret = tcp_snd_oob(fp->socket.cepid, (void *)buf, len, TMO_FEVR);409 ret = tcp_snd_oob(fp->socket.cepid, (void *)buf, len, SOCKET_TIMEOUT); 420 410 if (ret < 0) { 421 return - 1;411 return -ECOMM; 422 412 } 423 413 } 424 414 else { 425 ret = tcp_snd_dat(fp->socket.cepid, (void *)buf, len, TMO_FEVR);415 ret = tcp_snd_dat(fp->socket.cepid, (void *)buf, len, SOCKET_TIMEOUT); 426 416 if (ret < 0) { 427 return - 1;417 return -ECOMM; 428 418 } 429 419 } … … 431 421 } 432 422 case SOCK_DGRAM: { 433 return - 1;434 } 435 } 436 break; 437 } 438 case AF_INET6: { 439 break;423 return -EINVAL; 424 } 425 } 426 break; 427 } 428 case AF_INET6: { 429 return -EAFNOSUPPORT; 440 430 } 441 431 } … … 444 434 } 445 435 446 ssize_t s endto(int fd, const void *buf, size_t len, int flags, const struct sockaddr *addr, socklen_t alen)436 ssize_t shell_sendto(int fd, const void *buf, size_t len, int flags, const struct sockaddr *addr, socklen_t alen) 447 437 { 448 438 SOCKET *fp = fd_to_fp(fd); 449 439 if (fp == NULL) { 450 return - 1;440 return -EBADF; 451 441 } 452 442 … … 457 447 case SOCK_STREAM: { 458 448 if ((addr != NULL) && (alen != 0)) { 459 return - 1;449 return -EINVAL; 460 450 } 461 451 462 452 if (flags & MSG_OOB) { 463 ret = tcp_snd_oob(fp->socket.cepid, (void *)buf, len, TMO_FEVR);453 ret = tcp_snd_oob(fp->socket.cepid, (void *)buf, len, SOCKET_TIMEOUT); 464 454 if (ret < 0) { 465 return - 1;455 return -ECOMM; 466 456 } 467 457 } 468 458 else { 469 ret = tcp_snd_dat(fp->socket.cepid, (void *)buf, len, TMO_FEVR);459 ret = tcp_snd_dat(fp->socket.cepid, (void *)buf, len, SOCKET_TIMEOUT); 470 460 if (ret < 0) { 471 return - 1;461 return -ECOMM; 472 462 } 473 463 } … … 477 467 int sz = alen; 478 468 if (sz < 8) { 479 return - 1;469 return -EINVAL; 480 470 } 481 471 struct sockaddr_in *raddr = &fp->socket.raddr4; … … 483 473 memcpy(raddr, addr, sz); 484 474 T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) }; 485 ret = udp_snd_dat(fp->socket.cepid, &rep, (void *)buf, len, TMO_FEVR); 475 ret = udp_snd_dat(fp->socket.cepid, &rep, (void *)buf, len, 476 (fp->socket.flags & O_NONBLOCK) ? 0 : SOCKET_TIMEOUT); 486 477 if (ret < 0) { 487 return - 1;488 } 489 break; 490 } 491 } 492 break; 493 } 494 case AF_INET6: { 495 break;478 return -ECOMM; 479 } 480 break; 481 } 482 } 483 break; 484 } 485 case AF_INET6: { 486 return -EAFNOSUPPORT; 496 487 } 497 488 } … … 500 491 } 501 492 502 ssize_t recv(int fd, void *buf, size_t len, int flags) 493 ssize_t shell_sendmsg(int fd, const struct msghdr *msg, int flags) 494 { 495 no_implement("sendmsg\n"); 496 return -ENOSYS; 497 } 498 499 ssize_t shell_recv(int fd, void *buf, size_t len, int flags) 503 500 { 504 501 SOCKET *fp = fd_to_fp(fd); 505 502 if (fp == NULL) { 506 return - 1;503 return -EBADF; 507 504 } 508 505 … … 515 512 ret = tcp_rcv_oob(fp->socket.cepid, buf, len); 516 513 if (ret < 0) { 517 return - 1;514 return -ECOMM; 518 515 } 519 516 } … … 521 518 ret = tcp_rcv_dat(fp->socket.cepid, buf, len, TMO_FEVR); 522 519 if (ret < 0) { 523 return - 1;520 return -ECOMM; 524 521 } 525 522 } … … 528 525 case SOCK_DGRAM: { 529 526 T_IPV4EP rep = { 0, 0 }; 530 ret = udp_rcv_dat(fp->socket.cepid, &rep, buf, len, TMO_FEVR);527 ret = udp_rcv_dat(fp->socket.cepid, &rep, buf, len, (fp->socket.flags & O_NONBLOCK) ? 0 : TMO_FEVR); 531 528 if (ret < 0) { 532 return - 1;533 } 534 } 535 } 536 break; 537 } 538 case AF_INET6: { 539 break;529 return -ECOMM; 530 } 531 } 532 } 533 break; 534 } 535 case AF_INET6: { 536 return -EAFNOSUPPORT; 540 537 } 541 538 } … … 544 541 } 545 542 546 ssize_t recvfrom(int fd, void *buf, size_t len, int flags, struct sockaddr *addr, socklen_t *alen)543 ssize_t shell_recvfrom(int fd, void *buf, size_t len, int flags, struct sockaddr *__restrict addr, socklen_t *__restrict alen) 547 544 { 548 545 SOCKET *fp = fd_to_fp(fd); 549 546 if (fp == NULL) { 550 return - 1;547 return -EBADF; 551 548 } 552 549 … … 559 556 ret = tcp_rcv_oob(fp->socket.cepid, buf, len); 560 557 if (ret < 0) { 561 return - 1;558 return -ECOMM; 562 559 } 563 560 } … … 565 562 ret = tcp_rcv_dat(fp->socket.cepid, buf, len, TMO_FEVR); 566 563 if (ret < 0) { 567 return - 1;564 return -ECOMM; 568 565 } 569 566 } … … 574 571 ret = udp_rcv_dat(fp->socket.cepid, &rep, buf, len, TMO_FEVR); 575 572 if (ret < 0) { 576 return - 1;573 return -ECOMM; 577 574 } 578 575 int sz = *alen; … … 590 587 } 591 588 case AF_INET6: { 592 break;589 return -EAFNOSUPPORT; 593 590 } 594 591 } … … 597 594 } 598 595 599 int shutdown(int fd, int how) 596 ssize_t shell_recvmsg(int fd, struct msghdr *msg, int flags) 597 { 598 no_implement("recvmsg\n"); 599 return -ENOSYS; 600 } 601 602 int shell_shutdown(int fd, int how) 600 603 { 601 604 SOCKET *fp = fd_to_fp(fd); 602 605 if (fp == NULL) { 603 return - 1;606 return -EBADF; 604 607 } 605 608 … … 611 614 ret = tcp_sht_cep(fp->socket.cepid); 612 615 if (ret < 0) { 613 return - 1;614 } 615 break; 616 } 617 } 618 break; 619 } 620 case AF_INET6: { 621 break;616 return -ECOMM; 617 } 618 break; 619 } 620 } 621 break; 622 } 623 case AF_INET6: { 624 return -EAFNOSUPPORT; 622 625 } 623 626 } … … 626 629 } 627 630 628 int getsockopt(int fd, int level, int optname, void *optval, socklen_t *optlen)631 int shell_getsockopt(int fd, int level, int optname, void *optval, socklen_t *__restrict optlen) 629 632 { 630 633 SOCKET *fp = fd_to_fp(fd); 631 634 if (fp == NULL) { 632 return - 1;635 return -EBADF; 633 636 } 634 637 … … 650 653 ret = tcp_get_opt(fp->socket.cepid, optname, (void *)optval, *optlen); 651 654 if (ret < 0) { 652 return - 1;655 return -EINVAL; 653 656 } 654 657 *optlen = ret; … … 660 663 ret = udp_get_opt(fp->socket.cepid, optname, (void *)optval, *optlen); 661 664 if (ret < 0) { 662 return - 1;665 return -EINVAL; 663 666 } 664 667 *optlen = ret; … … 669 672 } 670 673 case AF_INET6: { 671 break;674 return -EAFNOSUPPORT; 672 675 } 673 676 } … … 676 679 } 677 680 678 int s etsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen)681 int shell_setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen) 679 682 { 680 683 SOCKET *fp = fd_to_fp(fd); 681 684 if (fp == NULL) { 682 return - 1;685 return -EBADF; 683 686 } 684 687 … … 700 703 ret = tcp_set_opt(fp->socket.cepid, optname, (void *)optval, optlen); 701 704 if (ret < 0) { 702 return - 1;705 return -EINVAL; 703 706 } 704 707 break; … … 709 712 ret = udp_set_opt(fp->socket.cepid, optname, (void *)optval, optlen); 710 713 if (ret < 0) { 711 return - 1;712 } 713 break; 714 } 715 } 716 break; 717 } 718 case AF_INET6: { 719 break;714 return -EINVAL; 715 } 716 break; 717 } 718 } 719 break; 720 } 721 case AF_INET6: { 722 return -EAFNOSUPPORT; 720 723 } 721 724 } … … 735 738 //return -1; 736 739 } 737 ret = tcp_cls_cep(cepid, TMO_FEVR);740 ret = tcp_cls_cep(cepid, (fp->socket.repid != 0) ? 0 : SOCKET_TIMEOUT); 738 741 if (ret < 0) { 739 742 //return -1; … … 743 746 delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid); 744 747 if (ret < 0) { 745 return - 1;748 return -EINVAL; 746 749 } 747 750 } … … 752 755 delete_id(tcp_repid_table, tcp_repid_table_count, repid); 753 756 if (ret < 0) { 754 return - 1;757 return -EINVAL; 755 758 } 756 759 } 757 760 else { 758 return - 1;759 } 760 break; 761 } 762 case AF_INET6: { 763 break;761 return -EINVAL; 762 } 763 break; 764 } 765 case AF_INET6: { 766 return -EAFNOSUPPORT; 764 767 } 765 768 } … … 770 773 size_t tcp_fd_read(struct _IO_FILE *fp, unsigned char *dst, size_t dstsz) 771 774 { 772 return recv(fp->fd, dst, dstsz, 0);775 return shell_recv(fp->fd, dst, dstsz, 0); 773 776 } 774 777 775 778 size_t tcp_fd_write(struct _IO_FILE *fp, const unsigned char *src, size_t srcsz) 776 779 { 777 return s end(fp->fd, src, srcsz, 0);780 return shell_send(fp->fd, src, srcsz, 0); 778 781 } 779 782 780 783 off_t tcp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org) 781 784 { 782 return -1; 785 return -EPERM; 786 } 787 788 int tcp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg) 789 { 790 return -EINVAL; 783 791 } 784 792 … … 794 802 delete_id(udp_cepid_table, udp_cepid_table_count, cepid); 795 803 if (ret < 0) { 796 return - 1;797 } 798 break; 799 } 800 case AF_INET6: { 801 break;804 return -EINVAL; 805 } 806 break; 807 } 808 case AF_INET6: { 809 return -EAFNOSUPPORT; 802 810 } 803 811 } … … 808 816 size_t udp_fd_read(struct _IO_FILE *fp, unsigned char *dst, size_t dstsz) 809 817 { 810 return recv(fp->fd, dst, dstsz, 0);818 return shell_recv(fp->fd, dst, dstsz, 0); 811 819 } 812 820 813 821 size_t udp_fd_write(struct _IO_FILE *fp, const unsigned char *src, size_t srcsz) 814 822 { 815 return s end(fp->fd, src, srcsz, 0);823 return shell_send(fp->fd, src, srcsz, 0); 816 824 } 817 825 818 826 off_t udp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org) 819 827 { 820 return -1; 828 return -EPERM; 829 } 830 831 int udp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg) 832 { 833 return -EINVAL; 821 834 } 822 835
Note:
See TracChangeset
for help on using the changeset viewer.