示例#1
0
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
示例#3
0
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);
}
示例#4
0
/*
 * 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);
}