データ構造 | |
struct | socket_info |
struct | swrap_file_hdr |
struct | swrap_packet |
列挙型 | |
enum | swrap_packet_type { SWRAP_CONNECT_SEND, SWRAP_CONNECT_UNREACH, SWRAP_CONNECT_RECV, SWRAP_CONNECT_ACK, SWRAP_ACCEPT_SEND, SWRAP_ACCEPT_RECV, SWRAP_ACCEPT_ACK, SWRAP_RECVFROM, SWRAP_SENDTO, SWRAP_SENDTO_UNREACH, SWRAP_PENDING_RST, SWRAP_RECV, SWRAP_RECV_RST, SWRAP_SEND, SWRAP_SEND_RST, SWRAP_CLOSE_SEND, SWRAP_CLOSE_RECV, SWRAP_CLOSE_ACK } |
関数 | |
static struct sockaddr * | sockaddr_dup (const void *data, socklen_t len) |
static const char * | socket_wrapper_dir (void) |
static unsigned int | socket_wrapper_default_iface (void) |
static int | convert_un_in (const struct sockaddr_un *un, struct sockaddr_in *in, socklen_t *len) |
static int | convert_in_un_remote (struct socket_info *si, const struct sockaddr_in *in, struct sockaddr_un *un, int *bcast) |
static int | convert_in_un_alloc (struct socket_info *si, const struct sockaddr_in *in, struct sockaddr_un *un, int *bcast) |
static struct socket_info * | find_socket_info (int fd) |
static int | sockaddr_convert_to_un (struct socket_info *si, const struct sockaddr *in_addr, socklen_t in_len, struct sockaddr_un *out_addr, int alloc_sock, int *bcast) |
static int | sockaddr_convert_from_un (const struct socket_info *si, const struct sockaddr_un *in_addr, socklen_t un_addrlen, int family, struct sockaddr *out_addr, socklen_t *_out_addrlen) |
static const char * | socket_wrapper_pcap_file (void) |
static struct swrap_packet * | swrap_packet_init (struct timeval *tval, const struct sockaddr_in *src_addr, const struct sockaddr_in *dest_addr, int socket_type, const unsigned char *payload, size_t payload_len, unsigned long tcp_seq, unsigned long tcp_ack, unsigned char tcp_ctl, int unreachable, size_t *_packet_len) |
static int | swrap_get_pcap_fd (const char *fname) |
static void | swrap_dump_packet (struct socket_info *si, const struct sockaddr *addr, enum swrap_packet_type type, const void *buf, size_t len) |
_PUBLIC_ int | swrap_socket (int family, int type, int protocol) |
_PUBLIC_ int | swrap_accept (int s, struct sockaddr *addr, socklen_t *addrlen) |
static int | swrap_auto_bind (struct socket_info *si) |
_PUBLIC_ int | swrap_connect (int s, const struct sockaddr *serv_addr, socklen_t addrlen) |
_PUBLIC_ int | swrap_bind (int s, const struct sockaddr *myaddr, socklen_t addrlen) |
_PUBLIC_ int | swrap_listen (int s, int backlog) |
_PUBLIC_ int | swrap_getpeername (int s, struct sockaddr *name, socklen_t *addrlen) |
_PUBLIC_ int | swrap_getsockname (int s, struct sockaddr *name, socklen_t *addrlen) |
_PUBLIC_ int | swrap_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen) |
_PUBLIC_ int | swrap_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen) |
_PUBLIC_ ssize_t | swrap_recvfrom (int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) |
_PUBLIC_ ssize_t | swrap_sendto (int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) |
_PUBLIC_ int | swrap_ioctl (int s, int r, void *p) |
_PUBLIC_ ssize_t | swrap_recv (int s, void *buf, size_t len, int flags) |
_PUBLIC_ ssize_t | swrap_send (int s, const void *buf, size_t len, int flags) |
_PUBLIC_ int | swrap_close (int fd) |
変数 | |
static struct socket_info * | sockets |
static int | autobind_start_init |
static int | autobind_start |
enum swrap_packet_type |
socket_wrapper.c の 480 行で定義されています。
00480 { 00481 SWRAP_CONNECT_SEND, 00482 SWRAP_CONNECT_UNREACH, 00483 SWRAP_CONNECT_RECV, 00484 SWRAP_CONNECT_ACK, 00485 SWRAP_ACCEPT_SEND, 00486 SWRAP_ACCEPT_RECV, 00487 SWRAP_ACCEPT_ACK, 00488 SWRAP_RECVFROM, 00489 SWRAP_SENDTO, 00490 SWRAP_SENDTO_UNREACH, 00491 SWRAP_PENDING_RST, 00492 SWRAP_RECV, 00493 SWRAP_RECV_RST, 00494 SWRAP_SEND, 00495 SWRAP_SEND_RST, 00496 SWRAP_CLOSE_SEND, 00497 SWRAP_CLOSE_RECV, 00498 SWRAP_CLOSE_ACK 00499 };
static struct sockaddr* sockaddr_dup | ( | const void * | data, | |
socklen_t | len | |||
) | [static] |
socket_wrapper.c の 150 行で定義されています。
参照元 swrap_accept()・swrap_auto_bind()・swrap_bind()・swrap_connect().
00151 { 00152 struct sockaddr *ret = (struct sockaddr *)malloc(len); 00153 memcpy(ret, data, len); 00154 return ret; 00155 }
static const char* socket_wrapper_dir | ( | void | ) | [static] |
socket_wrapper.c の 188 行で定義されています。
参照元 convert_in_un_alloc()・convert_in_un_remote()・swrap_auto_bind()・swrap_sendto()・swrap_socket().
00189 { 00190 const char *s = getenv("SOCKET_WRAPPER_DIR"); 00191 if (s == NULL) { 00192 return NULL; 00193 } 00194 if (strncmp(s, "./", 2) == 0) { 00195 s += 2; 00196 } 00197 return s; 00198 }
static unsigned int socket_wrapper_default_iface | ( | void | ) | [static] |
socket_wrapper.c の 200 行で定義されています。
参照元 convert_in_un_alloc()・convert_in_un_remote()・swrap_auto_bind().
00201 { 00202 const char *s = getenv("SOCKET_WRAPPER_DEFAULT_IFACE"); 00203 if (s) { 00204 unsigned int iface; 00205 if (sscanf(s, "%u", &iface) == 1) { 00206 if (iface >= 1 && iface <= MAX_WRAPPED_INTERFACES) { 00207 return iface; 00208 } 00209 } 00210 } 00211 00212 return 1;/* 127.0.0.1 */ 00213 }
static int convert_un_in | ( | const struct sockaddr_un * | un, | |
struct sockaddr_in * | in, | |||
socklen_t * | len | |||
) | [static] |
socket_wrapper.c の 215 行で定義されています。
参照元 sockaddr_convert_from_un().
00216 { 00217 unsigned int iface; 00218 unsigned int prt; 00219 const char *p; 00220 char type; 00221 00222 if ((*len) < sizeof(struct sockaddr_in)) { 00223 return 0; 00224 } 00225 00226 p = strrchr(un->sun_path, '/'); 00227 if (p) p++; else p = un->sun_path; 00228 00229 if (sscanf(p, SOCKET_FORMAT, &type, &iface, &prt) != 3) { 00230 errno = EINVAL; 00231 return -1; 00232 } 00233 00234 if (type != SOCKET_TYPE_CHAR_TCP && type != SOCKET_TYPE_CHAR_UDP) { 00235 errno = EINVAL; 00236 return -1; 00237 } 00238 00239 if (iface == 0 || iface > MAX_WRAPPED_INTERFACES) { 00240 errno = EINVAL; 00241 return -1; 00242 } 00243 00244 if (prt > 0xFFFF) { 00245 errno = EINVAL; 00246 return -1; 00247 } 00248 00249 in->sin_family = AF_INET; 00250 in->sin_addr.s_addr = htonl((127<<24) | iface); 00251 in->sin_port = htons(prt); 00252 00253 *len = sizeof(struct sockaddr_in); 00254 return 0; 00255 }
static int convert_in_un_remote | ( | struct socket_info * | si, | |
const struct sockaddr_in * | in, | |||
struct sockaddr_un * | un, | |||
int * | bcast | |||
) | [static] |
socket_wrapper.c の 257 行で定義されています。
参照先 errno・snprintf()・socket_wrapper_default_iface()・socket_wrapper_dir()・socket_info::type・type.
00259 { 00260 char u_type = '\0'; 00261 char b_type = '\0'; 00262 char a_type = '\0'; 00263 char type = '\0'; 00264 unsigned int addr= ntohl(in->sin_addr.s_addr); 00265 unsigned int prt = ntohs(in->sin_port); 00266 unsigned int iface; 00267 int is_bcast = 0; 00268 00269 if (bcast) *bcast = 0; 00270 00271 if (prt == 0) { 00272 errno = EINVAL; 00273 return -1; 00274 } 00275 00276 switch (si->type) { 00277 case SOCK_STREAM: 00278 u_type = SOCKET_TYPE_CHAR_TCP; 00279 break; 00280 case SOCK_DGRAM: 00281 u_type = SOCKET_TYPE_CHAR_UDP; 00282 a_type = SOCKET_TYPE_CHAR_UDP; 00283 b_type = SOCKET_TYPE_CHAR_UDP; 00284 break; 00285 } 00286 00287 if (a_type && addr == 0xFFFFFFFF) { 00288 /* 255.255.255.255 only udp */ 00289 is_bcast = 2; 00290 type = a_type; 00291 iface = socket_wrapper_default_iface(); 00292 } else if (b_type && addr == 0x7FFFFFFF) { 00293 /* 127.255.255.255 only udp */ 00294 is_bcast = 1; 00295 type = b_type; 00296 iface = socket_wrapper_default_iface(); 00297 } else if ((addr & 0xFFFFFF00) == 0x7F000000) { 00298 /* 127.0.0.X */ 00299 is_bcast = 0; 00300 type = u_type; 00301 iface = (addr & 0x000000FF); 00302 } else { 00303 errno = ENETUNREACH; 00304 return -1; 00305 } 00306 00307 if (bcast) *bcast = is_bcast; 00308 00309 if (is_bcast) { 00310 snprintf(un->sun_path, sizeof(un->sun_path), "%s/EINVAL", 00311 socket_wrapper_dir()); 00312 /* the caller need to do more processing */ 00313 return 0; 00314 } 00315 00316 snprintf(un->sun_path, sizeof(un->sun_path), "%s/"SOCKET_FORMAT, 00317 socket_wrapper_dir(), type, iface, prt); 00318 00319 return 0; 00320 }
static int convert_in_un_alloc | ( | struct socket_info * | si, | |
const struct sockaddr_in * | in, | |||
struct sockaddr_un * | un, | |||
int * | bcast | |||
) | [static] |
socket_wrapper.c の 322 行で定義されています。
参照先 errno・socket_info::myname・snprintf()・socket_wrapper_default_iface()・socket_wrapper_dir()・socket_info::type・type.
00324 { 00325 char u_type = '\0'; 00326 char d_type = '\0'; 00327 char b_type = '\0'; 00328 char a_type = '\0'; 00329 char type = '\0'; 00330 unsigned int addr= ntohl(in->sin_addr.s_addr); 00331 unsigned int prt = ntohs(in->sin_port); 00332 unsigned int iface; 00333 struct stat st; 00334 int is_bcast = 0; 00335 00336 if (bcast) *bcast = 0; 00337 00338 switch (si->type) { 00339 case SOCK_STREAM: 00340 u_type = SOCKET_TYPE_CHAR_TCP; 00341 d_type = SOCKET_TYPE_CHAR_TCP; 00342 break; 00343 case SOCK_DGRAM: 00344 u_type = SOCKET_TYPE_CHAR_UDP; 00345 d_type = SOCKET_TYPE_CHAR_UDP; 00346 a_type = SOCKET_TYPE_CHAR_UDP; 00347 b_type = SOCKET_TYPE_CHAR_UDP; 00348 break; 00349 } 00350 00351 if (addr == 0) { 00352 /* 0.0.0.0 */ 00353 is_bcast = 0; 00354 type = d_type; 00355 iface = socket_wrapper_default_iface(); 00356 } else if (a_type && addr == 0xFFFFFFFF) { 00357 /* 255.255.255.255 only udp */ 00358 is_bcast = 2; 00359 type = a_type; 00360 iface = socket_wrapper_default_iface(); 00361 } else if (b_type && addr == 0x7FFFFFFF) { 00362 /* 127.255.255.255 only udp */ 00363 is_bcast = 1; 00364 type = b_type; 00365 iface = socket_wrapper_default_iface(); 00366 } else if ((addr & 0xFFFFFF00) == 0x7F000000) { 00367 /* 127.0.0.X */ 00368 is_bcast = 0; 00369 type = u_type; 00370 iface = (addr & 0x000000FF); 00371 } else { 00372 errno = EADDRNOTAVAIL; 00373 return -1; 00374 } 00375 00376 if (bcast) *bcast = is_bcast; 00377 00378 if (prt == 0) { 00379 /* handle auto-allocation of ephemeral ports */ 00380 for (prt = 5001; prt < 10000; prt++) { 00381 snprintf(un->sun_path, sizeof(un->sun_path), "%s/"SOCKET_FORMAT, 00382 socket_wrapper_dir(), type, iface, prt); 00383 if (stat(un->sun_path, &st) == 0) continue; 00384 00385 ((struct sockaddr_in *)si->myname)->sin_port = htons(prt); 00386 return 0; 00387 } 00388 errno = ENFILE; 00389 return -1; 00390 } 00391 00392 snprintf(un->sun_path, sizeof(un->sun_path), "%s/"SOCKET_FORMAT, 00393 socket_wrapper_dir(), type, iface, prt); 00394 return 0; 00395 }
static struct socket_info* find_socket_info | ( | int | fd | ) | [static] |
socket_wrapper.c の 397 行で定義されています。
参照先 socket_info::fd・socket_info::next・sockets.
参照元 swrap_accept()・swrap_bind()・swrap_close()・swrap_connect()・swrap_getpeername()・swrap_getsockname()・swrap_getsockopt()・swrap_ioctl()・swrap_listen()・swrap_recv()・swrap_recvfrom()・swrap_send()・swrap_sendto()・swrap_setsockopt().
00398 { 00399 struct socket_info *i; 00400 for (i = sockets; i; i = i->next) { 00401 if (i->fd == fd) 00402 return i; 00403 } 00404 00405 return NULL; 00406 }
static int sockaddr_convert_to_un | ( | struct socket_info * | si, | |
const struct sockaddr * | in_addr, | |||
socklen_t | in_len, | |||
struct sockaddr_un * | out_addr, | |||
int | alloc_sock, | |||
int * | bcast | |||
) | [static] |
socket_wrapper.c の 408 行で定義されています。
参照先 convert_in_un_alloc()・convert_in_un_remote()・errno・socket_info::type.
参照元 swrap_bind()・swrap_connect()・swrap_sendto().
00410 { 00411 if (!out_addr) 00412 return 0; 00413 00414 out_addr->sun_family = AF_UNIX; 00415 00416 switch (in_addr->sa_family) { 00417 case AF_INET: 00418 switch (si->type) { 00419 case SOCK_STREAM: 00420 case SOCK_DGRAM: 00421 break; 00422 default: 00423 errno = ESOCKTNOSUPPORT; 00424 return -1; 00425 } 00426 if (alloc_sock) { 00427 return convert_in_un_alloc(si, (const struct sockaddr_in *)in_addr, out_addr, bcast); 00428 } else { 00429 return convert_in_un_remote(si, (const struct sockaddr_in *)in_addr, out_addr, bcast); 00430 } 00431 default: 00432 break; 00433 } 00434 00435 errno = EAFNOSUPPORT; 00436 return -1; 00437 }
static int sockaddr_convert_from_un | ( | const struct socket_info * | si, | |
const struct sockaddr_un * | in_addr, | |||
socklen_t | un_addrlen, | |||
int | family, | |||
struct sockaddr * | out_addr, | |||
socklen_t * | _out_addrlen | |||
) | [static] |
socket_wrapper.c の 439 行で定義されています。
参照先 convert_un_in()・errno・socket_info::type.
参照元 swrap_accept()・swrap_recvfrom().
00445 { 00446 socklen_t out_addrlen; 00447 00448 if (out_addr == NULL || _out_addrlen == NULL) 00449 return 0; 00450 00451 if (un_addrlen == 0) { 00452 *_out_addrlen = 0; 00453 return 0; 00454 } 00455 00456 out_addrlen = *_out_addrlen; 00457 if (out_addrlen > un_addrlen) { 00458 out_addrlen = un_addrlen; 00459 } 00460 00461 switch (family) { 00462 case AF_INET: 00463 switch (si->type) { 00464 case SOCK_STREAM: 00465 case SOCK_DGRAM: 00466 break; 00467 default: 00468 errno = ESOCKTNOSUPPORT; 00469 return -1; 00470 } 00471 return convert_un_in(in_addr, (struct sockaddr_in *)out_addr, _out_addrlen); 00472 default: 00473 break; 00474 } 00475 00476 errno = EAFNOSUPPORT; 00477 return -1; 00478 }
static const char* socket_wrapper_pcap_file | ( | void | ) | [static] |
socket_wrapper.c の 570 行で定義されています。
参照先 initialized・swrap_packet::p.
参照元 swrap_dump_packet().
00571 { 00572 static int initialized = 0; 00573 static const char *s = NULL; 00574 static const struct swrap_file_hdr h; 00575 static const struct swrap_packet p; 00576 00577 if (initialized == 1) { 00578 return s; 00579 } 00580 initialized = 1; 00581 00582 /* 00583 * TODO: don't use the structs use plain buffer offsets 00584 * and PUSH_U8(), PUSH_U16() and PUSH_U32() 00585 * 00586 * for now make sure we disable PCAP support 00587 * if the struct has alignment! 00588 */ 00589 if (sizeof(h) != SWRAP_FILE_HDR_SIZE) { 00590 return NULL; 00591 } 00592 if (sizeof(p) != SWRAP_PACKET_SIZE) { 00593 return NULL; 00594 } 00595 if (sizeof(p.frame) != SWRAP_PACKET__FRAME_SIZE) { 00596 return NULL; 00597 } 00598 if (sizeof(p.ip.hdr) != SWRAP_PACKET__IP_HDR_SIZE) { 00599 return NULL; 00600 } 00601 if (sizeof(p.ip.p.tcp) != SWRAP_PACKET__IP_P_TCP_SIZE) { 00602 return NULL; 00603 } 00604 if (sizeof(p.ip.p.udp) != SWRAP_PACKET__IP_P_UDP_SIZE) { 00605 return NULL; 00606 } 00607 if (sizeof(p.ip.p.icmp) != SWRAP_PACKET__IP_P_ICMP_SIZE) { 00608 return NULL; 00609 } 00610 00611 s = getenv("SOCKET_WRAPPER_PCAP_FILE"); 00612 if (s == NULL) { 00613 return NULL; 00614 } 00615 if (strncmp(s, "./", 2) == 0) { 00616 s += 2; 00617 } 00618 return s; 00619 }
static struct swrap_packet* swrap_packet_init | ( | struct timeval * | tval, | |
const struct sockaddr_in * | src_addr, | |||
const struct sockaddr_in * | dest_addr, | |||
int | socket_type, | |||
const unsigned char * | payload, | |||
size_t | payload_len, | |||
unsigned long | tcp_seq, | |||
unsigned long | tcp_ack, | |||
unsigned char | tcp_ctl, | |||
int | unreachable, | |||
size_t * | _packet_len | |||
) | [static] |
socket_wrapper.c の 621 行で定義されています。
参照先 swrap_packet::dest_port・swrap_packet::p・packet・swrap_packet::protocol.
参照元 swrap_dump_packet().
00632 { 00633 struct swrap_packet *ret; 00634 struct swrap_packet *packet; 00635 size_t packet_len; 00636 size_t alloc_len; 00637 size_t nonwire_len = sizeof(packet->frame); 00638 size_t wire_hdr_len = 0; 00639 size_t wire_len = 0; 00640 size_t icmp_hdr_len = 0; 00641 size_t icmp_truncate_len = 0; 00642 unsigned char protocol = 0, icmp_protocol = 0; 00643 unsigned short src_port = src_addr->sin_port; 00644 unsigned short dest_port = dest_addr->sin_port; 00645 00646 switch (socket_type) { 00647 case SOCK_STREAM: 00648 protocol = 0x06; /* TCP */ 00649 wire_hdr_len = sizeof(packet->ip.hdr) + sizeof(packet->ip.p.tcp); 00650 wire_len = wire_hdr_len + payload_len; 00651 break; 00652 00653 case SOCK_DGRAM: 00654 protocol = 0x11; /* UDP */ 00655 wire_hdr_len = sizeof(packet->ip.hdr) + sizeof(packet->ip.p.udp); 00656 wire_len = wire_hdr_len + payload_len; 00657 break; 00658 } 00659 00660 if (unreachable) { 00661 icmp_protocol = protocol; 00662 protocol = 0x01; /* ICMP */ 00663 if (wire_len > 64 ) { 00664 icmp_truncate_len = wire_len - 64; 00665 } 00666 icmp_hdr_len = sizeof(packet->ip.hdr) + sizeof(packet->ip.p.icmp); 00667 wire_hdr_len += icmp_hdr_len; 00668 wire_len += icmp_hdr_len; 00669 } 00670 00671 packet_len = nonwire_len + wire_len; 00672 alloc_len = packet_len; 00673 if (alloc_len < sizeof(struct swrap_packet)) { 00674 alloc_len = sizeof(struct swrap_packet); 00675 } 00676 ret = (struct swrap_packet *)malloc(alloc_len); 00677 if (!ret) return NULL; 00678 00679 packet = ret; 00680 00681 packet->frame.seconds = tval->tv_sec; 00682 packet->frame.micro_seconds = tval->tv_usec; 00683 packet->frame.recorded_length = wire_len - icmp_truncate_len; 00684 packet->frame.full_length = wire_len - icmp_truncate_len; 00685 00686 packet->ip.hdr.ver_hdrlen = 0x45; /* version 4 and 5 * 32 bit words */ 00687 packet->ip.hdr.tos = 0x00; 00688 packet->ip.hdr.packet_length = htons(wire_len - icmp_truncate_len); 00689 packet->ip.hdr.identification = htons(0xFFFF); 00690 packet->ip.hdr.flags = 0x40; /* BIT 1 set - means don't fraqment */ 00691 packet->ip.hdr.fragment = htons(0x0000); 00692 packet->ip.hdr.ttl = 0xFF; 00693 packet->ip.hdr.protocol = protocol; 00694 packet->ip.hdr.hdr_checksum = htons(0x0000); 00695 packet->ip.hdr.src_addr = src_addr->sin_addr.s_addr; 00696 packet->ip.hdr.dest_addr = dest_addr->sin_addr.s_addr; 00697 00698 if (unreachable) { 00699 packet->ip.p.icmp.type = 0x03; /* destination unreachable */ 00700 packet->ip.p.icmp.code = 0x01; /* host unreachable */ 00701 packet->ip.p.icmp.checksum = htons(0x0000); 00702 packet->ip.p.icmp.unused = htonl(0x00000000); 00703 00704 /* set the ip header in the ICMP payload */ 00705 packet = (struct swrap_packet *)(((unsigned char *)ret) + icmp_hdr_len); 00706 packet->ip.hdr.ver_hdrlen = 0x45; /* version 4 and 5 * 32 bit words */ 00707 packet->ip.hdr.tos = 0x00; 00708 packet->ip.hdr.packet_length = htons(wire_len - icmp_hdr_len); 00709 packet->ip.hdr.identification = htons(0xFFFF); 00710 packet->ip.hdr.flags = 0x40; /* BIT 1 set - means don't fraqment */ 00711 packet->ip.hdr.fragment = htons(0x0000); 00712 packet->ip.hdr.ttl = 0xFF; 00713 packet->ip.hdr.protocol = icmp_protocol; 00714 packet->ip.hdr.hdr_checksum = htons(0x0000); 00715 packet->ip.hdr.src_addr = dest_addr->sin_addr.s_addr; 00716 packet->ip.hdr.dest_addr = src_addr->sin_addr.s_addr; 00717 00718 src_port = dest_addr->sin_port; 00719 dest_port = src_addr->sin_port; 00720 } 00721 00722 switch (socket_type) { 00723 case SOCK_STREAM: 00724 packet->ip.p.tcp.source_port = src_port; 00725 packet->ip.p.tcp.dest_port = dest_port; 00726 packet->ip.p.tcp.seq_num = htonl(tcp_seq); 00727 packet->ip.p.tcp.ack_num = htonl(tcp_ack); 00728 packet->ip.p.tcp.hdr_length = 0x50; /* 5 * 32 bit words */ 00729 packet->ip.p.tcp.control = tcp_ctl; 00730 packet->ip.p.tcp.window = htons(0x7FFF); 00731 packet->ip.p.tcp.checksum = htons(0x0000); 00732 packet->ip.p.tcp.urg = htons(0x0000); 00733 00734 break; 00735 00736 case SOCK_DGRAM: 00737 packet->ip.p.udp.source_port = src_addr->sin_port; 00738 packet->ip.p.udp.dest_port = dest_addr->sin_port; 00739 packet->ip.p.udp.length = htons(8 + payload_len); 00740 packet->ip.p.udp.checksum = htons(0x0000); 00741 00742 break; 00743 } 00744 00745 if (payload && payload_len > 0) { 00746 unsigned char *p = (unsigned char *)ret; 00747 p += nonwire_len; 00748 p += wire_hdr_len; 00749 memcpy(p, payload, payload_len); 00750 } 00751 00752 *_packet_len = packet_len - icmp_truncate_len; 00753 return ret; 00754 }
static int swrap_get_pcap_fd | ( | const char * | fname | ) | [static] |
socket_wrapper.c の 756 行で定義されています。
参照先 fd・swrap_file_hdr::frame_max_len・swrap_file_hdr::link_type・swrap_file_hdr::magic・swrap_file_hdr::sigfigs・swrap_file_hdr::timezone・swrap_file_hdr::version_major・swrap_file_hdr::version_minor.
参照元 swrap_dump_packet().
00757 { 00758 static int fd = -1; 00759 00760 if (fd != -1) return fd; 00761 00762 fd = open(fname, O_WRONLY|O_CREAT|O_EXCL|O_APPEND, 0644); 00763 if (fd != -1) { 00764 struct swrap_file_hdr file_hdr; 00765 file_hdr.magic = 0xA1B2C3D4; 00766 file_hdr.version_major = 0x0002; 00767 file_hdr.version_minor = 0x0004; 00768 file_hdr.timezone = 0x00000000; 00769 file_hdr.sigfigs = 0x00000000; 00770 file_hdr.frame_max_len = SWRAP_FRAME_LENGTH_MAX; 00771 file_hdr.link_type = 0x0065; /* 101 RAW IP */ 00772 00773 write(fd, &file_hdr, sizeof(file_hdr)); 00774 return fd; 00775 } 00776 00777 fd = open(fname, O_WRONLY|O_APPEND, 0644); 00778 00779 return fd; 00780 }
static void swrap_dump_packet | ( | struct socket_info * | si, | |
const struct sockaddr * | addr, | |||
enum swrap_packet_type | type, | |||
const void * | buf, | |||
size_t | len | |||
) | [static] |
socket_wrapper.c の 782 行で定義されています。
参照先 socket_info::family・fd・socket_info::io・socket_info::myname・packet・socket_info::pck_rcv・socket_info::pck_snd・socket_info::peername・socket_wrapper_pcap_file()・SWRAP_ACCEPT_ACK・SWRAP_ACCEPT_RECV・SWRAP_ACCEPT_SEND・SWRAP_CLOSE_ACK・SWRAP_CLOSE_RECV・SWRAP_CLOSE_SEND・SWRAP_CONNECT_ACK・SWRAP_CONNECT_RECV・SWRAP_CONNECT_SEND・SWRAP_CONNECT_UNREACH・swrap_get_pcap_fd()・swrap_packet_init()・SWRAP_PENDING_RST・SWRAP_RECV・SWRAP_RECV_RST・SWRAP_RECVFROM・SWRAP_SEND・SWRAP_SEND_RST・SWRAP_SENDTO・SWRAP_SENDTO_UNREACH・socket_info::type.
参照元 swrap_accept()・swrap_close()・swrap_connect()・swrap_ioctl()・swrap_recv()・swrap_recvfrom()・swrap_send()・swrap_sendto().
00785 { 00786 const struct sockaddr_in *src_addr; 00787 const struct sockaddr_in *dest_addr; 00788 const char *file_name; 00789 unsigned long tcp_seq = 0; 00790 unsigned long tcp_ack = 0; 00791 unsigned char tcp_ctl = 0; 00792 int unreachable = 0; 00793 struct timeval tv; 00794 struct swrap_packet *packet; 00795 size_t packet_len = 0; 00796 int fd; 00797 00798 file_name = socket_wrapper_pcap_file(); 00799 if (!file_name) { 00800 return; 00801 } 00802 00803 if (si->family != AF_INET) { 00804 return; 00805 } 00806 00807 switch (type) { 00808 case SWRAP_CONNECT_SEND: 00809 if (si->type != SOCK_STREAM) return; 00810 00811 src_addr = (const struct sockaddr_in *)si->myname; 00812 dest_addr = (const struct sockaddr_in *)addr; 00813 00814 tcp_seq = si->io.pck_snd; 00815 tcp_ack = si->io.pck_rcv; 00816 tcp_ctl = 0x02; /* SYN */ 00817 00818 si->io.pck_snd += 1; 00819 00820 break; 00821 00822 case SWRAP_CONNECT_RECV: 00823 if (si->type != SOCK_STREAM) return; 00824 00825 dest_addr = (const struct sockaddr_in *)si->myname; 00826 src_addr = (const struct sockaddr_in *)addr; 00827 00828 tcp_seq = si->io.pck_rcv; 00829 tcp_ack = si->io.pck_snd; 00830 tcp_ctl = 0x12; /** SYN,ACK */ 00831 00832 si->io.pck_rcv += 1; 00833 00834 break; 00835 00836 case SWRAP_CONNECT_UNREACH: 00837 if (si->type != SOCK_STREAM) return; 00838 00839 dest_addr = (const struct sockaddr_in *)si->myname; 00840 src_addr = (const struct sockaddr_in *)addr; 00841 00842 /* Unreachable: resend the data of SWRAP_CONNECT_SEND */ 00843 tcp_seq = si->io.pck_snd - 1; 00844 tcp_ack = si->io.pck_rcv; 00845 tcp_ctl = 0x02; /* SYN */ 00846 unreachable = 1; 00847 00848 break; 00849 00850 case SWRAP_CONNECT_ACK: 00851 if (si->type != SOCK_STREAM) return; 00852 00853 src_addr = (const struct sockaddr_in *)si->myname; 00854 dest_addr = (const struct sockaddr_in *)addr; 00855 00856 tcp_seq = si->io.pck_snd; 00857 tcp_ack = si->io.pck_rcv; 00858 tcp_ctl = 0x10; /* ACK */ 00859 00860 break; 00861 00862 case SWRAP_ACCEPT_SEND: 00863 if (si->type != SOCK_STREAM) return; 00864 00865 dest_addr = (const struct sockaddr_in *)si->myname; 00866 src_addr = (const struct sockaddr_in *)addr; 00867 00868 tcp_seq = si->io.pck_rcv; 00869 tcp_ack = si->io.pck_snd; 00870 tcp_ctl = 0x02; /* SYN */ 00871 00872 si->io.pck_rcv += 1; 00873 00874 break; 00875 00876 case SWRAP_ACCEPT_RECV: 00877 if (si->type != SOCK_STREAM) return; 00878 00879 src_addr = (const struct sockaddr_in *)si->myname; 00880 dest_addr = (const struct sockaddr_in *)addr; 00881 00882 tcp_seq = si->io.pck_snd; 00883 tcp_ack = si->io.pck_rcv; 00884 tcp_ctl = 0x12; /* SYN,ACK */ 00885 00886 si->io.pck_snd += 1; 00887 00888 break; 00889 00890 case SWRAP_ACCEPT_ACK: 00891 if (si->type != SOCK_STREAM) return; 00892 00893 dest_addr = (const struct sockaddr_in *)si->myname; 00894 src_addr = (const struct sockaddr_in *)addr; 00895 00896 tcp_seq = si->io.pck_rcv; 00897 tcp_ack = si->io.pck_snd; 00898 tcp_ctl = 0x10; /* ACK */ 00899 00900 break; 00901 00902 case SWRAP_SEND: 00903 src_addr = (const struct sockaddr_in *)si->myname; 00904 dest_addr = (const struct sockaddr_in *)si->peername; 00905 00906 tcp_seq = si->io.pck_snd; 00907 tcp_ack = si->io.pck_rcv; 00908 tcp_ctl = 0x18; /* PSH,ACK */ 00909 00910 si->io.pck_snd += len; 00911 00912 break; 00913 00914 case SWRAP_SEND_RST: 00915 dest_addr = (const struct sockaddr_in *)si->myname; 00916 src_addr = (const struct sockaddr_in *)si->peername; 00917 00918 if (si->type == SOCK_DGRAM) { 00919 swrap_dump_packet(si, si->peername, 00920 SWRAP_SENDTO_UNREACH, 00921 buf, len); 00922 return; 00923 } 00924 00925 tcp_seq = si->io.pck_rcv; 00926 tcp_ack = si->io.pck_snd; 00927 tcp_ctl = 0x14; /** RST,ACK */ 00928 00929 break; 00930 00931 case SWRAP_PENDING_RST: 00932 dest_addr = (const struct sockaddr_in *)si->myname; 00933 src_addr = (const struct sockaddr_in *)si->peername; 00934 00935 if (si->type == SOCK_DGRAM) { 00936 return; 00937 } 00938 00939 tcp_seq = si->io.pck_rcv; 00940 tcp_ack = si->io.pck_snd; 00941 tcp_ctl = 0x14; /* RST,ACK */ 00942 00943 break; 00944 00945 case SWRAP_RECV: 00946 dest_addr = (const struct sockaddr_in *)si->myname; 00947 src_addr = (const struct sockaddr_in *)si->peername; 00948 00949 tcp_seq = si->io.pck_rcv; 00950 tcp_ack = si->io.pck_snd; 00951 tcp_ctl = 0x18; /* PSH,ACK */ 00952 00953 si->io.pck_rcv += len; 00954 00955 break; 00956 00957 case SWRAP_RECV_RST: 00958 dest_addr = (const struct sockaddr_in *)si->myname; 00959 src_addr = (const struct sockaddr_in *)si->peername; 00960 00961 if (si->type == SOCK_DGRAM) { 00962 return; 00963 } 00964 00965 tcp_seq = si->io.pck_rcv; 00966 tcp_ack = si->io.pck_snd; 00967 tcp_ctl = 0x14; /* RST,ACK */ 00968 00969 break; 00970 00971 case SWRAP_SENDTO: 00972 src_addr = (const struct sockaddr_in *)si->myname; 00973 dest_addr = (const struct sockaddr_in *)addr; 00974 00975 si->io.pck_snd += len; 00976 00977 break; 00978 00979 case SWRAP_SENDTO_UNREACH: 00980 dest_addr = (const struct sockaddr_in *)si->myname; 00981 src_addr = (const struct sockaddr_in *)addr; 00982 00983 unreachable = 1; 00984 00985 break; 00986 00987 case SWRAP_RECVFROM: 00988 dest_addr = (const struct sockaddr_in *)si->myname; 00989 src_addr = (const struct sockaddr_in *)addr; 00990 00991 si->io.pck_rcv += len; 00992 00993 break; 00994 00995 case SWRAP_CLOSE_SEND: 00996 if (si->type != SOCK_STREAM) return; 00997 00998 src_addr = (const struct sockaddr_in *)si->myname; 00999 dest_addr = (const struct sockaddr_in *)si->peername; 01000 01001 tcp_seq = si->io.pck_snd; 01002 tcp_ack = si->io.pck_rcv; 01003 tcp_ctl = 0x11; /* FIN, ACK */ 01004 01005 si->io.pck_snd += 1; 01006 01007 break; 01008 01009 case SWRAP_CLOSE_RECV: 01010 if (si->type != SOCK_STREAM) return; 01011 01012 dest_addr = (const struct sockaddr_in *)si->myname; 01013 src_addr = (const struct sockaddr_in *)si->peername; 01014 01015 tcp_seq = si->io.pck_rcv; 01016 tcp_ack = si->io.pck_snd; 01017 tcp_ctl = 0x11; /* FIN,ACK */ 01018 01019 si->io.pck_rcv += 1; 01020 01021 break; 01022 01023 case SWRAP_CLOSE_ACK: 01024 if (si->type != SOCK_STREAM) return; 01025 01026 src_addr = (const struct sockaddr_in *)si->myname; 01027 dest_addr = (const struct sockaddr_in *)si->peername; 01028 01029 tcp_seq = si->io.pck_snd; 01030 tcp_ack = si->io.pck_rcv; 01031 tcp_ctl = 0x10; /* ACK */ 01032 01033 break; 01034 default: 01035 return; 01036 } 01037 01038 swrapGetTimeOfDay(&tv); 01039 01040 packet = swrap_packet_init(&tv, src_addr, dest_addr, si->type, 01041 (const unsigned char *)buf, len, 01042 tcp_seq, tcp_ack, tcp_ctl, unreachable, 01043 &packet_len); 01044 if (!packet) { 01045 return; 01046 } 01047 01048 fd = swrap_get_pcap_fd(file_name); 01049 if (fd != -1) { 01050 write(fd, packet, packet_len); 01051 } 01052 01053 free(packet); 01054 }
_PUBLIC_ int swrap_socket | ( | int | family, | |
int | type, | |||
int | protocol | |||
) |
socket_wrapper.c の 1056 行で定義されています。
参照先 errno・socket_info::family・fd・socket_info::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 }
_PUBLIC_ 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 }
static int swrap_auto_bind | ( | struct socket_info * | si | ) | [static] |
socket_wrapper.c の 1189 行で定義されています。
参照先 autobind_start・autobind_start_init・socket_info::bound・errno・socket_info::fd・socket_info::myname・socket_info::myname_len・port・snprintf()・sockaddr_dup()・socket_wrapper_default_iface()・socket_wrapper_dir()・strdup()・socket_info::tmp_path・socket_info::type・type.
参照元 swrap_connect()・swrap_sendto().
01190 { 01191 struct sockaddr_un un_addr; 01192 struct sockaddr_in in; 01193 int i; 01194 char type; 01195 int ret; 01196 int port; 01197 struct stat st; 01198 01199 if (autobind_start_init != 1) { 01200 autobind_start_init = 1; 01201 autobind_start = getpid(); 01202 autobind_start %= 50000; 01203 autobind_start += 10000; 01204 } 01205 01206 un_addr.sun_family = AF_UNIX; 01207 01208 switch (si->type) { 01209 case SOCK_STREAM: 01210 type = SOCKET_TYPE_CHAR_TCP; 01211 break; 01212 case SOCK_DGRAM: 01213 type = SOCKET_TYPE_CHAR_UDP; 01214 break; 01215 default: 01216 errno = ESOCKTNOSUPPORT; 01217 return -1; 01218 } 01219 01220 if (autobind_start > 60000) { 01221 autobind_start = 10000; 01222 } 01223 01224 for (i=0;i<1000;i++) { 01225 port = autobind_start + i; 01226 snprintf(un_addr.sun_path, sizeof(un_addr.sun_path), 01227 "%s/"SOCKET_FORMAT, socket_wrapper_dir(), 01228 type, socket_wrapper_default_iface(), port); 01229 if (stat(un_addr.sun_path, &st) == 0) continue; 01230 01231 ret = real_bind(si->fd, (struct sockaddr *)&un_addr, sizeof(un_addr)); 01232 if (ret == -1) return ret; 01233 01234 si->tmp_path = strdup(un_addr.sun_path); 01235 si->bound = 1; 01236 autobind_start = port + 1; 01237 break; 01238 } 01239 if (i == 1000) { 01240 errno = ENFILE; 01241 return -1; 01242 } 01243 01244 memset(&in, 0, sizeof(in)); 01245 in.sin_family = AF_INET; 01246 in.sin_port = htons(port); 01247 in.sin_addr.s_addr = htonl(127<<24 | socket_wrapper_default_iface()); 01248 01249 si->myname_len = sizeof(in); 01250 si->myname = sockaddr_dup(&in, si->myname_len); 01251 return 0; 01252 }
_PUBLIC_ 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 }
_PUBLIC_ 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 }
_PUBLIC_ 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 }
_PUBLIC_ 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 }
_PUBLIC_ 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 }
_PUBLIC_ 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 }
_PUBLIC_ 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 }
_PUBLIC_ 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 }
_PUBLIC_ 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 }
_PUBLIC_ int swrap_ioctl | ( | int | s, | |
int | r, | |||
void * | p | |||
) |
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 }
_PUBLIC_ 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 }
_PUBLIC_ 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 }
_PUBLIC_ int swrap_close | ( | int | fd | ) |
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 }
struct socket_info* sockets [static] |
socket_wrapper.c の 185 行で定義されています。
参照元 find_socket_info()・open_any_socket_out()・swrap_accept()・swrap_close()・swrap_socket().
int autobind_start_init [static] |
int autobind_start [static] |