関数 | |
int | swrap_socket (int family, int type, int protocol) |
int | swrap_accept (int s, struct sockaddr *addr, socklen_t *addrlen) |
int | swrap_connect (int s, const struct sockaddr *serv_addr, socklen_t addrlen) |
int | swrap_bind (int s, const struct sockaddr *myaddr, socklen_t addrlen) |
int | swrap_listen (int s, int backlog) |
int | swrap_getpeername (int s, struct sockaddr *name, socklen_t *addrlen) |
int | swrap_getsockname (int s, struct sockaddr *name, socklen_t *addrlen) |
int | swrap_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen) |
int | swrap_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen) |
ssize_t | swrap_recvfrom (int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) |
ssize_t | swrap_sendto (int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) |
int | swrap_ioctl (int s, int req, void *ptr) |
ssize_t | swrap_recv (int s, void *buf, size_t len, int flags) |
ssize_t | swrap_send (int s, const void *buf, size_t len, int flags) |
int | swrap_close (int) |
int swrap_socket | ( | int | family, | |
int | type, | |||
int | protocol | |||
) |
socket_wrapper.c の 1056 行で定義されています。
参照先 errno・socket_info::family・socket_info::fd・fd・socket_info::protocol・socket_wrapper_dir()・sockets・socket_info::type.
01057 { 01058 struct socket_info *si; 01059 int fd; 01060 01061 if (!socket_wrapper_dir()) { 01062 return real_socket(family, type, protocol); 01063 } 01064 01065 switch (family) { 01066 case AF_INET: 01067 break; 01068 case AF_UNIX: 01069 return real_socket(family, type, protocol); 01070 default: 01071 errno = EAFNOSUPPORT; 01072 return -1; 01073 } 01074 01075 switch (type) { 01076 case SOCK_STREAM: 01077 break; 01078 case SOCK_DGRAM: 01079 break; 01080 default: 01081 errno = EPROTONOSUPPORT; 01082 return -1; 01083 } 01084 01085 switch (protocol) { 01086 case 0: 01087 break; 01088 default: 01089 errno = EPROTONOSUPPORT; 01090 return -1; 01091 } 01092 01093 fd = real_socket(AF_UNIX, type, 0); 01094 01095 if (fd == -1) return -1; 01096 01097 si = (struct socket_info *)calloc(1, sizeof(struct socket_info)); 01098 01099 si->family = family; 01100 si->type = type; 01101 si->protocol = protocol; 01102 si->fd = fd; 01103 01104 SWRAP_DLIST_ADD(sockets, si); 01105 01106 return si->fd; 01107 }
int swrap_accept | ( | int | s, | |
struct sockaddr * | addr, | |||
socklen_t * | addrlen | |||
) |
socket_wrapper.c の 1109 行で定義されています。
参照先 socket_info::family・fd・find_socket_info()・socket_info::protocol・sockaddr_convert_from_un()・sockaddr_dup()・sockets・SWRAP_ACCEPT_ACK・SWRAP_ACCEPT_RECV・SWRAP_ACCEPT_SEND・swrap_dump_packet()・socket_info::type.
01110 { 01111 struct socket_info *parent_si, *child_si; 01112 int fd; 01113 struct sockaddr_un un_addr; 01114 socklen_t un_addrlen = sizeof(un_addr); 01115 struct sockaddr_un un_my_addr; 01116 socklen_t un_my_addrlen = sizeof(un_my_addr); 01117 struct sockaddr my_addr; 01118 socklen_t my_addrlen = sizeof(my_addr); 01119 int ret; 01120 01121 parent_si = find_socket_info(s); 01122 if (!parent_si) { 01123 return real_accept(s, addr, addrlen); 01124 } 01125 01126 memset(&un_addr, 0, sizeof(un_addr)); 01127 memset(&un_my_addr, 0, sizeof(un_my_addr)); 01128 memset(&my_addr, 0, sizeof(my_addr)); 01129 01130 ret = real_accept(s, (struct sockaddr *)&un_addr, &un_addrlen); 01131 if (ret == -1) return ret; 01132 01133 fd = ret; 01134 01135 ret = sockaddr_convert_from_un(parent_si, &un_addr, un_addrlen, 01136 parent_si->family, addr, addrlen); 01137 if (ret == -1) { 01138 close(fd); 01139 return ret; 01140 } 01141 01142 child_si = (struct socket_info *)malloc(sizeof(struct socket_info)); 01143 memset(child_si, 0, sizeof(*child_si)); 01144 01145 child_si->fd = fd; 01146 child_si->family = parent_si->family; 01147 child_si->type = parent_si->type; 01148 child_si->protocol = parent_si->protocol; 01149 child_si->bound = 1; 01150 child_si->is_server = 1; 01151 01152 ret = real_getsockname(fd, (struct sockaddr *)&un_my_addr, &un_my_addrlen); 01153 if (ret == -1) { 01154 free(child_si); 01155 close(fd); 01156 return ret; 01157 } 01158 01159 ret = sockaddr_convert_from_un(child_si, &un_my_addr, un_my_addrlen, 01160 child_si->family, &my_addr, &my_addrlen); 01161 if (ret == -1) { 01162 free(child_si); 01163 close(fd); 01164 return ret; 01165 } 01166 01167 child_si->myname_len = my_addrlen; 01168 child_si->myname = sockaddr_dup(&my_addr, my_addrlen); 01169 01170 child_si->peername_len = *addrlen; 01171 child_si->peername = sockaddr_dup(addr, *addrlen); 01172 01173 SWRAP_DLIST_ADD(sockets, child_si); 01174 01175 swrap_dump_packet(child_si, addr, SWRAP_ACCEPT_SEND, NULL, 0); 01176 swrap_dump_packet(child_si, addr, SWRAP_ACCEPT_RECV, NULL, 0); 01177 swrap_dump_packet(child_si, addr, SWRAP_ACCEPT_ACK, NULL, 0); 01178 01179 return fd; 01180 }
int swrap_connect | ( | int | s, | |
const struct sockaddr * | serv_addr, | |||
socklen_t | addrlen | |||
) |
socket_wrapper.c の 1255 行で定義されています。
参照先 socket_info::bound・errno・find_socket_info()・socket_info::peername・socket_info::peername_len・sockaddr_convert_to_un()・sockaddr_dup()・swrap_auto_bind()・SWRAP_CONNECT_ACK・SWRAP_CONNECT_RECV・SWRAP_CONNECT_SEND・SWRAP_CONNECT_UNREACH・swrap_dump_packet().
01256 { 01257 int ret; 01258 struct sockaddr_un un_addr; 01259 struct socket_info *si = find_socket_info(s); 01260 01261 if (!si) { 01262 return real_connect(s, serv_addr, addrlen); 01263 } 01264 01265 if (si->bound == 0) { 01266 ret = swrap_auto_bind(si); 01267 if (ret == -1) return -1; 01268 } 01269 01270 ret = sockaddr_convert_to_un(si, (const struct sockaddr *)serv_addr, addrlen, &un_addr, 0, NULL); 01271 if (ret == -1) return -1; 01272 01273 swrap_dump_packet(si, serv_addr, SWRAP_CONNECT_SEND, NULL, 0); 01274 01275 ret = real_connect(s, (struct sockaddr *)&un_addr, 01276 sizeof(struct sockaddr_un)); 01277 01278 /* to give better errors */ 01279 if (ret == -1 && errno == ENOENT) { 01280 errno = EHOSTUNREACH; 01281 } 01282 01283 if (ret == 0) { 01284 si->peername_len = addrlen; 01285 si->peername = sockaddr_dup(serv_addr, addrlen); 01286 01287 swrap_dump_packet(si, serv_addr, SWRAP_CONNECT_RECV, NULL, 0); 01288 swrap_dump_packet(si, serv_addr, SWRAP_CONNECT_ACK, NULL, 0); 01289 } else { 01290 swrap_dump_packet(si, serv_addr, SWRAP_CONNECT_UNREACH, NULL, 0); 01291 } 01292 01293 return ret; 01294 }
int swrap_bind | ( | int | s, | |
const struct sockaddr * | myaddr, | |||
socklen_t | addrlen | |||
) |
socket_wrapper.c の 1296 行で定義されています。
参照先 socket_info::bcast・socket_info::bound・find_socket_info()・socket_info::myname・socket_info::myname_len・sockaddr_convert_to_un()・sockaddr_dup().
01297 { 01298 int ret; 01299 struct sockaddr_un un_addr; 01300 struct socket_info *si = find_socket_info(s); 01301 01302 if (!si) { 01303 return real_bind(s, myaddr, addrlen); 01304 } 01305 01306 si->myname_len = addrlen; 01307 si->myname = sockaddr_dup(myaddr, addrlen); 01308 01309 ret = sockaddr_convert_to_un(si, (const struct sockaddr *)myaddr, addrlen, &un_addr, 1, &si->bcast); 01310 if (ret == -1) return -1; 01311 01312 unlink(un_addr.sun_path); 01313 01314 ret = real_bind(s, (struct sockaddr *)&un_addr, 01315 sizeof(struct sockaddr_un)); 01316 01317 if (ret == 0) { 01318 si->bound = 1; 01319 } 01320 01321 return ret; 01322 }
int swrap_listen | ( | int | s, | |
int | backlog | |||
) |
socket_wrapper.c の 1324 行で定義されています。
参照先 find_socket_info().
01325 { 01326 int ret; 01327 struct socket_info *si = find_socket_info(s); 01328 01329 if (!si) { 01330 return real_listen(s, backlog); 01331 } 01332 01333 ret = real_listen(s, backlog); 01334 01335 return ret; 01336 }
int swrap_getpeername | ( | int | s, | |
struct sockaddr * | name, | |||
socklen_t * | addrlen | |||
) |
socket_wrapper.c の 1338 行で定義されています。
参照先 errno・find_socket_info()・name・socket_info::peername・socket_info::peername_len.
01339 { 01340 struct socket_info *si = find_socket_info(s); 01341 01342 if (!si) { 01343 return real_getpeername(s, name, addrlen); 01344 } 01345 01346 if (!si->peername) 01347 { 01348 errno = ENOTCONN; 01349 return -1; 01350 } 01351 01352 memcpy(name, si->peername, si->peername_len); 01353 *addrlen = si->peername_len; 01354 01355 return 0; 01356 }
int swrap_getsockname | ( | int | s, | |
struct sockaddr * | name, | |||
socklen_t * | addrlen | |||
) |
socket_wrapper.c の 1358 行で定義されています。
参照先 find_socket_info()・socket_info::myname・socket_info::myname_len・name.
01359 { 01360 struct socket_info *si = find_socket_info(s); 01361 01362 if (!si) { 01363 return real_getsockname(s, name, addrlen); 01364 } 01365 01366 memcpy(name, si->myname, si->myname_len); 01367 *addrlen = si->myname_len; 01368 01369 return 0; 01370 }
int swrap_getsockopt | ( | int | s, | |
int | level, | |||
int | optname, | |||
void * | optval, | |||
socklen_t * | optlen | |||
) |
socket_wrapper.c の 1372 行で定義されています。
参照先 errno・find_socket_info().
01373 { 01374 struct socket_info *si = find_socket_info(s); 01375 01376 if (!si) { 01377 return real_getsockopt(s, level, optname, optval, optlen); 01378 } 01379 01380 if (level == SOL_SOCKET) { 01381 return real_getsockopt(s, level, optname, optval, optlen); 01382 } 01383 01384 errno = ENOPROTOOPT; 01385 return -1; 01386 }
int swrap_setsockopt | ( | int | s, | |
int | level, | |||
int | optname, | |||
const void * | optval, | |||
socklen_t | optlen | |||
) |
socket_wrapper.c の 1388 行で定義されています。
参照先 errno・socket_info::family・find_socket_info().
01389 { 01390 struct socket_info *si = find_socket_info(s); 01391 01392 if (!si) { 01393 return real_setsockopt(s, level, optname, optval, optlen); 01394 } 01395 01396 if (level == SOL_SOCKET) { 01397 return real_setsockopt(s, level, optname, optval, optlen); 01398 } 01399 01400 switch (si->family) { 01401 case AF_INET: 01402 return 0; 01403 default: 01404 errno = ENOPROTOOPT; 01405 return -1; 01406 } 01407 }
ssize_t swrap_recvfrom | ( | int | s, | |
void * | buf, | |||
size_t | len, | |||
int | flags, | |||
struct sockaddr * | from, | |||
socklen_t * | fromlen | |||
) |
socket_wrapper.c の 1409 行で定義されています。
参照先 socket_info::family・find_socket_info()・from・sockaddr_convert_from_un()・swrap_dump_packet()・SWRAP_RECVFROM.
01410 { 01411 struct sockaddr_un un_addr; 01412 socklen_t un_addrlen = sizeof(un_addr); 01413 int ret; 01414 struct socket_info *si = find_socket_info(s); 01415 01416 if (!si) { 01417 return real_recvfrom(s, buf, len, flags, from, fromlen); 01418 } 01419 01420 /* irix 6.4 forgets to null terminate the sun_path string :-( */ 01421 memset(&un_addr, 0, sizeof(un_addr)); 01422 ret = real_recvfrom(s, buf, len, flags, (struct sockaddr *)&un_addr, &un_addrlen); 01423 if (ret == -1) 01424 return ret; 01425 01426 if (sockaddr_convert_from_un(si, &un_addr, un_addrlen, 01427 si->family, from, fromlen) == -1) { 01428 return -1; 01429 } 01430 01431 swrap_dump_packet(si, from, SWRAP_RECVFROM, buf, ret); 01432 01433 return ret; 01434 }
ssize_t swrap_sendto | ( | int | s, | |
const void * | buf, | |||
size_t | len, | |||
int | flags, | |||
const struct sockaddr * | to, | |||
socklen_t | tolen | |||
) |
socket_wrapper.c の 1437 行で定義されています。
参照先 socket_info::bcast・socket_info::bound・errno・find_socket_info()・snprintf()・sockaddr_convert_to_un()・socket_wrapper_dir()・swrap_auto_bind()・swrap_dump_packet()・SWRAP_SENDTO・SWRAP_SENDTO_UNREACH・to・type.
01438 { 01439 struct sockaddr_un un_addr; 01440 int ret; 01441 struct socket_info *si = find_socket_info(s); 01442 int bcast = 0; 01443 01444 if (!si) { 01445 return real_sendto(s, buf, len, flags, to, tolen); 01446 } 01447 01448 if (si->bound == 0) { 01449 ret = swrap_auto_bind(si); 01450 if (ret == -1) return -1; 01451 } 01452 01453 ret = sockaddr_convert_to_un(si, to, tolen, &un_addr, 0, &bcast); 01454 if (ret == -1) return -1; 01455 01456 if (bcast) { 01457 struct stat st; 01458 unsigned int iface; 01459 unsigned int prt = ntohs(((const struct sockaddr_in *)to)->sin_port); 01460 char type; 01461 01462 type = SOCKET_TYPE_CHAR_UDP; 01463 01464 for(iface=0; iface <= MAX_WRAPPED_INTERFACES; iface++) { 01465 snprintf(un_addr.sun_path, sizeof(un_addr.sun_path), "%s/"SOCKET_FORMAT, 01466 socket_wrapper_dir(), type, iface, prt); 01467 if (stat(un_addr.sun_path, &st) != 0) continue; 01468 01469 /* ignore the any errors in broadcast sends */ 01470 real_sendto(s, buf, len, flags, (struct sockaddr *)&un_addr, sizeof(un_addr)); 01471 } 01472 01473 swrap_dump_packet(si, to, SWRAP_SENDTO, buf, len); 01474 01475 return len; 01476 } 01477 01478 ret = real_sendto(s, buf, len, flags, (struct sockaddr *)&un_addr, sizeof(un_addr)); 01479 01480 /* to give better errors */ 01481 if (ret == -1 && errno == ENOENT) { 01482 errno = EHOSTUNREACH; 01483 } 01484 01485 if (ret == -1) { 01486 swrap_dump_packet(si, to, SWRAP_SENDTO, buf, len); 01487 swrap_dump_packet(si, to, SWRAP_SENDTO_UNREACH, buf, len); 01488 } else { 01489 swrap_dump_packet(si, to, SWRAP_SENDTO, buf, ret); 01490 } 01491 01492 return ret; 01493 }
int swrap_ioctl | ( | int | s, | |
int | req, | |||
void * | ptr | |||
) |
socket_wrapper.c の 1495 行で定義されています。
参照先 errno・find_socket_info()・swrap_dump_packet()・SWRAP_PENDING_RST.
01496 { 01497 int ret; 01498 struct socket_info *si = find_socket_info(s); 01499 int value; 01500 01501 if (!si) { 01502 return real_ioctl(s, r, p); 01503 } 01504 01505 ret = real_ioctl(s, r, p); 01506 01507 switch (r) { 01508 case FIONREAD: 01509 value = *((int *)p); 01510 if (ret == -1 && errno != EAGAIN && errno != ENOBUFS) { 01511 swrap_dump_packet(si, NULL, SWRAP_PENDING_RST, NULL, 0); 01512 } else if (value == 0) { /* END OF FILE */ 01513 swrap_dump_packet(si, NULL, SWRAP_PENDING_RST, NULL, 0); 01514 } 01515 break; 01516 } 01517 01518 return ret; 01519 }
ssize_t swrap_recv | ( | int | s, | |
void * | buf, | |||
size_t | len, | |||
int | flags | |||
) |
socket_wrapper.c の 1521 行で定義されています。
参照先 errno・find_socket_info()・swrap_dump_packet()・SWRAP_RECV・SWRAP_RECV_RST.
01522 { 01523 int ret; 01524 struct socket_info *si = find_socket_info(s); 01525 01526 if (!si) { 01527 return real_recv(s, buf, len, flags); 01528 } 01529 01530 ret = real_recv(s, buf, len, flags); 01531 if (ret == -1 && errno != EAGAIN && errno != ENOBUFS) { 01532 swrap_dump_packet(si, NULL, SWRAP_RECV_RST, NULL, 0); 01533 } else if (ret == 0) { /* END OF FILE */ 01534 swrap_dump_packet(si, NULL, SWRAP_RECV_RST, NULL, 0); 01535 } else { 01536 swrap_dump_packet(si, NULL, SWRAP_RECV, buf, ret); 01537 } 01538 01539 return ret; 01540 }
ssize_t swrap_send | ( | int | s, | |
const void * | buf, | |||
size_t | len, | |||
int | flags | |||
) |
socket_wrapper.c の 1543 行で定義されています。
参照先 find_socket_info()・swrap_dump_packet()・SWRAP_SEND・SWRAP_SEND_RST.
01544 { 01545 int ret; 01546 struct socket_info *si = find_socket_info(s); 01547 01548 if (!si) { 01549 return real_send(s, buf, len, flags); 01550 } 01551 01552 ret = real_send(s, buf, len, flags); 01553 01554 if (ret == -1) { 01555 swrap_dump_packet(si, NULL, SWRAP_SEND, buf, len); 01556 swrap_dump_packet(si, NULL, SWRAP_SEND_RST, NULL, 0); 01557 } else { 01558 swrap_dump_packet(si, NULL, SWRAP_SEND, buf, ret); 01559 } 01560 01561 return ret; 01562 }
int swrap_close | ( | int | ) |
socket_wrapper.c の 1564 行で定義されています。
参照先 find_socket_info()・socket_info::myname・socket_info::path・socket_info::peername・sockets・SWRAP_CLOSE_ACK・SWRAP_CLOSE_RECV・SWRAP_CLOSE_SEND・swrap_dump_packet()・socket_info::tmp_path.
01565 { 01566 struct socket_info *si = find_socket_info(fd); 01567 int ret; 01568 01569 if (!si) { 01570 return real_close(fd); 01571 } 01572 01573 SWRAP_DLIST_REMOVE(sockets, si); 01574 01575 if (si->myname && si->peername) { 01576 swrap_dump_packet(si, NULL, SWRAP_CLOSE_SEND, NULL, 0); 01577 } 01578 01579 ret = real_close(fd); 01580 01581 if (si->myname && si->peername) { 01582 swrap_dump_packet(si, NULL, SWRAP_CLOSE_RECV, NULL, 0); 01583 swrap_dump_packet(si, NULL, SWRAP_CLOSE_ACK, NULL, 0); 01584 } 01585 01586 if (si->path) free(si->path); 01587 if (si->myname) free(si->myname); 01588 if (si->peername) free(si->peername); 01589 if (si->tmp_path) { 01590 unlink(si->tmp_path); 01591 free(si->tmp_path); 01592 } 01593 free(si); 01594 01595 return ret; 01596 }