lib/socket_wrapper/socket_wrapper.h

ソースコードを見る。

関数

int swrap_socket (int family, int type, int protocol)
int swrap_accept (int s, struct sockaddr *addr, socklen_t *addrlen)
int swrap_connect (int s, const struct sockaddr *serv_addr, socklen_t addrlen)
int swrap_bind (int s, const struct sockaddr *myaddr, socklen_t addrlen)
int swrap_listen (int s, int backlog)
int swrap_getpeername (int s, struct sockaddr *name, socklen_t *addrlen)
int swrap_getsockname (int s, struct sockaddr *name, socklen_t *addrlen)
int swrap_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen)
int swrap_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen)
ssize_t swrap_recvfrom (int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen)
ssize_t swrap_sendto (int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)
int swrap_ioctl (int s, int req, void *ptr)
ssize_t swrap_recv (int s, void *buf, size_t len, int flags)
ssize_t swrap_send (int s, const void *buf, size_t len, int flags)
int swrap_close (int)


関数

int swrap_socket ( int  family,
int  type,
int  protocol 
)

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

参照先 errnosocket_info::familysocket_info::fdfdsocket_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 }

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 }

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 }

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 }

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 }

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 }

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 }

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 }

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 }

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 }

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 }

int swrap_ioctl ( int  s,
int  req,
void *  ptr 
)

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 }

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 }

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 }

int swrap_close ( int   ) 

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 }


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