static int __msgwrite(int sock, void *buf, size_t cnt) { struct iovec iov[1]; struct msghdr msg; union { struct cmsghdr cmsg; char control[CMSG_SPACE(sizeof(struct cmsgcred))]; } cm; bzero((char *)&cm, sizeof(cm)); iov[0].iov_base = buf; iov[0].iov_len = cnt; cm.cmsg.cmsg_type = SCM_CREDS; cm.cmsg.cmsg_level = SOL_SOCKET; cm.cmsg.cmsg_len = CMSG_LEN(sizeof(struct cmsgcred)); msg.msg_iov = iov; msg.msg_iovlen = 1; msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_control = (caddr_t)&cm; msg.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred)); msg.msg_flags = 0; return(_sendmsg(sock, &msg, 0)); }
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags) { _sendmsg = (ssize_t (*) (int sockfd, const struct msghdr *msg, int flags) ) dlsym(RTLD_NEXT, "sendmsg"); char *errormsg; errormsg = dlerror(); if (errormsg != NULL) { PRINT_DEBUG("\n failed to load the original symbol %s", errormsg); } PRINT_DEBUG ("sockfd got into sendmsg = %d",sockfd); if (checkFinsHistory(getpid(),sockfd) != 0) { return ( fins_sendmsg(sockfd,msg,flags) ); } else { PRINT_DEBUG("The original sendmsg should not be called ,something is WRONG!!!"); return ( _sendmsg(sockfd,msg,flags) ); } } // end of sendmsg
ssize_t __sendmsg(int fd, const struct msghdr *msg, int flags) { int ret; _thread_enter_cancellation_point(); ret = _sendmsg(fd, msg, flags); _thread_leave_cancellation_point(); return (ret); }
/* * Sends the credentials information to the connection along with the * communication element type. */ static int send_credentials(struct cached_connection_ *connection, int type) { struct kevent eventlist; int nevents; ssize_t result; int res; struct msghdr cred_hdr; struct iovec iov; struct { struct cmsghdr hdr; char cred[CMSG_SPACE(sizeof(struct cmsgcred))]; } cmsg; memset(&cmsg, 0, sizeof(cmsg)); cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(struct cmsgcred)); cmsg.hdr.cmsg_level = SOL_SOCKET; cmsg.hdr.cmsg_type = SCM_CREDS; memset(&cred_hdr, 0, sizeof(struct msghdr)); cred_hdr.msg_iov = &iov; cred_hdr.msg_iovlen = 1; cred_hdr.msg_control = (caddr_t)&cmsg; cred_hdr.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred)); iov.iov_base = &type; iov.iov_len = sizeof(int); EV_SET(&eventlist, connection->sockfd, EVFILT_WRITE, EV_ADD, NOTE_LOWAT, sizeof(int), NULL); res = _kevent(connection->write_queue, &eventlist, 1, NULL, 0, NULL); nevents = _kevent(connection->write_queue, NULL, 0, &eventlist, 1, NULL); if (nevents == 1 && eventlist.filter == EVFILT_WRITE) { result = (_sendmsg(connection->sockfd, &cred_hdr, MSG_NOSIGNAL) == -1) ? -1 : 0; EV_SET(&eventlist, connection->sockfd, EVFILT_WRITE, EV_ADD, 0, 0, NULL); _kevent(connection->write_queue, &eventlist, 1, NULL, 0, NULL); return (result); } else return (-1); }