lib/socket_wrapper/socket_wrapper.c

ソースコードを見る。

データ構造

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_infofind_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_packetswrap_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_infosockets
static int autobind_start_init
static int autobind_start


列挙型

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 

socket_wrapper.c480 行で定義されています。


関数

static struct sockaddr* sockaddr_dup ( const void *  data,
socklen_t  len 
) [static]

socket_wrapper.c150 行で定義されています。

参照元 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.c188 行で定義されています。

参照元 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.c200 行で定義されています。

参照元 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.c215 行で定義されています。

参照先 errnotype.

参照元 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.c257 行で定義されています。

参照先 errnosnprintf()socket_wrapper_default_iface()socket_wrapper_dir()socket_info::typetype.

参照元 sockaddr_convert_to_un().

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.c322 行で定義されています。

参照先 errnosocket_info::mynamesnprintf()socket_wrapper_default_iface()socket_wrapper_dir()socket_info::typetype.

参照元 sockaddr_convert_to_un().

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.c397 行で定義されています。

参照先 socket_info::fdsocket_info::nextsockets.

参照元 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.c408 行で定義されています。

参照先 convert_in_un_alloc()convert_in_un_remote()errnosocket_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.c439 行で定義されています。

参照先 convert_un_in()errnosocket_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.c570 行で定義されています。

参照先 initializedswrap_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.c621 行で定義されています。

参照先 swrap_packet::dest_portswrap_packet::ppacketswrap_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.c756 行で定義されています。

参照先 fdswrap_file_hdr::frame_max_lenswrap_file_hdr::link_typeswrap_file_hdr::magicswrap_file_hdr::sigfigsswrap_file_hdr::timezoneswrap_file_hdr::version_majorswrap_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.c782 行で定義されています。

参照先 socket_info::familyfdsocket_info::iosocket_info::mynamepacketsocket_info::pck_rcvsocket_info::pck_sndsocket_info::peernamesocket_wrapper_pcap_file()SWRAP_ACCEPT_ACKSWRAP_ACCEPT_RECVSWRAP_ACCEPT_SENDSWRAP_CLOSE_ACKSWRAP_CLOSE_RECVSWRAP_CLOSE_SENDSWRAP_CONNECT_ACKSWRAP_CONNECT_RECVSWRAP_CONNECT_SENDSWRAP_CONNECT_UNREACHswrap_get_pcap_fd()swrap_packet_init()SWRAP_PENDING_RSTSWRAP_RECVSWRAP_RECV_RSTSWRAP_RECVFROMSWRAP_SENDSWRAP_SEND_RSTSWRAP_SENDTOSWRAP_SENDTO_UNREACHsocket_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.c1056 行で定義されています。

参照先 errnosocket_info::familyfdsocket_info::fdsocket_info::protocolsocket_wrapper_dir()socketssocket_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.c1109 行で定義されています。

参照先 socket_info::familyfdfind_socket_info()socket_info::protocolsockaddr_convert_from_un()sockaddr_dup()socketsSWRAP_ACCEPT_ACKSWRAP_ACCEPT_RECVSWRAP_ACCEPT_SENDswrap_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.c1189 行で定義されています。

参照先 autobind_startautobind_start_initsocket_info::bounderrnosocket_info::fdsocket_info::mynamesocket_info::myname_lenportsnprintf()sockaddr_dup()socket_wrapper_default_iface()socket_wrapper_dir()strdup()socket_info::tmp_pathsocket_info::typetype.

参照元 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.c1255 行で定義されています。

参照先 socket_info::bounderrnofind_socket_info()socket_info::peernamesocket_info::peername_lensockaddr_convert_to_un()sockaddr_dup()swrap_auto_bind()SWRAP_CONNECT_ACKSWRAP_CONNECT_RECVSWRAP_CONNECT_SENDSWRAP_CONNECT_UNREACHswrap_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.c1296 行で定義されています。

参照先 socket_info::bcastsocket_info::boundfind_socket_info()socket_info::mynamesocket_info::myname_lensockaddr_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.c1324 行で定義されています。

参照先 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.c1338 行で定義されています。

参照先 errnofind_socket_info()namesocket_info::peernamesocket_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.c1358 行で定義されています。

参照先 find_socket_info()socket_info::mynamesocket_info::myname_lenname.

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.c1372 行で定義されています。

参照先 errnofind_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.c1388 行で定義されています。

参照先 errnosocket_info::familyfind_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.c1409 行で定義されています。

参照先 socket_info::familyfind_socket_info()fromsockaddr_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.c1437 行で定義されています。

参照先 socket_info::bcastsocket_info::bounderrnofind_socket_info()snprintf()sockaddr_convert_to_un()socket_wrapper_dir()swrap_auto_bind()swrap_dump_packet()SWRAP_SENDTOSWRAP_SENDTO_UNREACHtotype.

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.c1495 行で定義されています。

参照先 errnofind_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.c1521 行で定義されています。

参照先 errnofind_socket_info()swrap_dump_packet()SWRAP_RECVSWRAP_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.c1543 行で定義されています。

参照先 find_socket_info()swrap_dump_packet()SWRAP_SENDSWRAP_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.c1564 行で定義されています。

参照先 find_socket_info()socket_info::mynamesocket_info::pathsocket_info::peernamesocketsSWRAP_CLOSE_ACKSWRAP_CLOSE_RECVSWRAP_CLOSE_SENDswrap_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.c185 行で定義されています。

参照元 find_socket_info()open_any_socket_out()swrap_accept()swrap_close()swrap_socket().

int autobind_start_init [static]

socket_wrapper.c1182 行で定義されています。

参照元 swrap_auto_bind().

int autobind_start [static]

socket_wrapper.c1183 行で定義されています。

参照元 swrap_auto_bind().


Sambaに対してSat Aug 29 21:23:38 2009に生成されました。  doxygen 1.4.7