⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hg_comm.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	sigemptyset(&zeromask);	sigemptyset(&newmask);	sigaddset(&newmask, SIGHUP);	sigaddset(&newmask, SIGUSR1);	sigaddset(&newmask, SIGUSR2);	if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) return -1;	return fcntl(fd, F_SETFL, O_NONBLOCK | O_NDELAY /* | FNBIO*/);#endif}int write_to(int fd, void *buffer, int n, int timeout){	int nrem, nw=0;	char *bptr;	int  error=0;#if defined(SYSV) || defined(PHP_WIN32)	int    width = 20;#else	int    width = getdtablesize();#endif	fd_set writefds;	struct timeval select_timeout;	select_timeout.tv_sec = timeout;#ifdef PHP_WIN32	select_timeout.tv_usec = 0;#else /* is this just a typo? */	select_timeout.tv_usec = 0.;#endif	/*  Set fd to non-blocking  */	if (set_noblock(fd) != 0) return -1;	/*  Write to fd until no more can be written  */	FD_ZERO(&writefds);	FD_SET((unsigned int)fd, &writefds); 	for( nrem = n, bptr = buffer; nrem;)		{		if(( error = select(width, 		                    (fd_set *) 0, 		                    &writefds,                                     (fd_set *) 0,                            &select_timeout)) <= 0 && errno != EINTR) break;    		if(errno != EINTR && ( nw = write(fd, bptr, nrem)) <= 0) {			/*			 *  check for error number - and keep trying to			 *  write			 */			if(errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR)				{				continue;				}			else				{				error = nw;				break;				}		} else {			nrem -= nw;			bptr += nw;		}	}#ifndef PHP_WIN32	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) return -1;#endif	if( ! error ) {		errno = ETIMEDOUT;		return(-2);	} else if (error < 0) {		return(error);	} else {		return(n);	}}int read_to(int fd, char *buffer, int n, int timeout)  {  int nrem, nread, nr=0;  char *bptr;  int  error=0;#if defined(SYSV) || defined(PHP_WIN32)  int    width = 20;#else  int    width = getdtablesize();#endif  fd_set readfds;  struct timeval select_timeout;  select_timeout.tv_sec = timeout;#ifdef PHP_WIN32  select_timeout.tv_usec = 0;#else  select_timeout.tv_usec = 0.;#endif    /*  Set fd to non-blocking  */  if (set_noblock(fd) != 0) return -1;  FD_ZERO(&readfds);  FD_SET((unsigned int)fd, &readfds);    for( nrem = n, bptr = buffer, nread = 0; nrem;)    {    if(( error = select(width,             &readfds,             (fd_set *) 0,             (fd_set *) 0,             &select_timeout)) <= 0 && errno != EINTR) break;        if(errno != EINTR && (nr =  read (fd, bptr, nrem)) < 0)      {      /*       *  check for error number - and keep trying to       *  read       */      if(errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR)        {        continue;        }      else        {        error = nr;        break;        }      }    else if(nr == 0)      {      break;      }    else      {      nread += nr;      bptr  += nr;      nrem  -= nr;      }    }#ifndef PHP_WIN32  if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) return -1;#endif  if( ! error )    {    errno = ETIMEDOUT;    return(-2);    }  else if ( error < 0)     {    return(-1);    }  else    {    return(nread);    }  }void set_swap(int do_swap){     swap_on = do_swap;}/************************************************************************ Function open_hg_connection()                                        **                                                                      ************************************************************************/int open_hg_connection(char *server_name, int port){	int sockfd;	int option = 1;	struct sockaddr_in server_addr;	struct hostent *hp;	if ( NULL == server_name )		return(-1);	if ( (hp = gethostbyname(server_name)) == NULL )  {		return(-2);	}	bzero((char *)&server_addr, sizeof(server_addr));	server_addr.sin_family = AF_INET;	if ( port != 0 )		server_addr.sin_port = htons(port);	else		server_addr.sin_port = htons(HG_SERVER_PORT); /*	bcopy(hp->h_addr, (char *) &server_addr.sin_addr, hp->h_length); */	server_addr.sin_addr = *(struct in_addr *) hp->h_addr;	if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERR )  {		return(-3);	}#if defined(SUN) || defined(PHP_WIN32)	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&option, sizeof(option));#else	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));#endif /* SUN */	if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {		HWSOCK_FCLOSE(sockfd);		return(-4);	} #ifndef PHP_WIN32	if ( (sock_flags = fcntl(sockfd, F_GETFL, 0)) == -1 )#endif	if ( set_nonblocking(sockfd) == -1 )  {		HWSOCK_FCLOSE(sockfd);		return(-5);	}	return(sockfd);}/************************************************************************ Function initialize_hg_connection()                                  **                                                                      ************************************************************************/int initialize_hg_connection(int sockfd, int *do_swap, int *version, char **userdata,  char **server_string, char *username, char *password){	char buf, c;        char *tmp;	hg_msg *ready_msg, *retmsg, msg;	int i = 0x01;	int length;	*do_swap = 0;	buf = 'T';	if ( hg_write(sockfd, &buf, 1) == -1 )  {		return(-2);	}	if ( hg_read_exact(sockfd, &buf, 1) == -1 )  {		return(-3);	}	if ( buf == 'F' )  {		return(-4);	}	if ( buf != 'T' )  {		return(-5);	}	buf = c = ( *(char *)&i )  ? 'l' : 'B';	if ( hg_write(sockfd, &buf, 1) == -1 )  {		return(-6);	}	if ( hg_read_exact(sockfd, &buf, 1) == -1 )  {		return(-7);	}	if ( c != buf )  {		swap_on = 1;		*do_swap = 1;	} else {		swap_on = 0;		*do_swap = 0;	}	if ( send_ready(sockfd) == -1) {		return(-8);		}	/* Receive return from Ready message */	if ( (ready_msg = recv_ready(sockfd)) == NULL )  {		return(-9);	}   	if ((ready_msg->version_msgid & F_VERSION) < HW_VERSION)		return(-8);	*version = ready_msg->version_msgid;	*server_string = strdup(ready_msg->buf+4);	efree(ready_msg->buf);	efree(ready_msg);	/* If we have a username and password then do the identification. */	if((NULL != username) && (NULL != password)) {		length = HEADER_LENGTH + sizeof(int) + strlen(username) + 1 + strlen(password) + 1;		build_msg_header(&msg, length, msgid++, IDENTIFY_MESSAGE);		if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL )  {			lowerror = LE_MALLOC;			return(-1);		}		tmp = build_msg_int(msg.buf, 0);		tmp = build_msg_str(tmp, username);		tmp = build_msg_str(tmp, password);		if ( send_hg_msg(sockfd, &msg, length) == -1 )  {			efree(msg.buf);			return(-10);		}		efree(msg.buf);	}	if((NULL != username) && (NULL != password)) {		/* Receive return form identify message */		retmsg = recv_hg_msg(sockfd);		if ( retmsg == NULL )			return(-11);		*userdata = retmsg->buf;		efree(retmsg);	}	return(0);}static int set_nonblocking(int fd){#ifdef PHP_WIN32	unsigned int argp=0;/*	if ( sock_flags == -1 )		getsockopt (fd, SOL_SOCKET, optname, optval, optlen); */	if(ioctlsocket (fd, FIONBIO , &argp) == -1)		return(-1);#else	if ( sock_flags == -1 )		sock_flags = fcntl(fd, F_GETFL, 0);	if ( fcntl(fd, F_SETFL, O_NONBLOCK) == -1 )		return(-1);#endif	non_blocking = 1;	return(0);}/*static int set_blocking(int fd){#ifdef PHP_WIN32	unsigned int argp=1;	if(ioctlsocket (fd, FIONBIO , &argp) == -1)		return(-1);#else	if ( fcntl(fd, F_SETFL, sock_flags) == -1 )		return(-1);#endif	return(0);}*/static int hg_read_exact(int sockfd, char *buf, int size){	int len = 0;	len = read_to(sockfd, (void *) buf, size, rtimeout);	if ( len < 0 ) 		return -1;	return(len);}/*static int hg_read(int sockfd, char *buf, int size){	int try = 0;	int len = 0;	if ( !non_blocking )		set_nonblocking(sockfd);  	while ( len == 0 )  {		len = recv(sockfd, (void *) buf, size, 0);		if ( len == -1 )  {			if ( (errno == EAGAIN) || (errno == EWOULDBLOCK) )  {				if ( ++try > 5 )					return(-1);				php_sleep(1);			} 			else return(-1);		} 	}	return(len);}*/static int hg_write(int sockfd, char *buf, int size){	int try = 0;	int len = 0;	if ( !non_blocking )		set_nonblocking(sockfd);  	while ( size > 0 )  {		len = send(sockfd, (void *) buf, size, 0);		if ( len == -1 )  {			if ( (errno == EAGAIN) || (errno == EWOULDBLOCK) )  {				if ( ++try > 5 )					return(-1);				php_sleep(1);			} 			else return(-1);		} 		else  {			size -= len;			buf  += len;			try   = 0;		}	}	return(0);}hg_msg *recv_hg_msg_head(int sockfd){	hg_msg *msg;	if ( (msg = (hg_msg *)emalloc(sizeof(hg_msg))) == NULL )  {		lowerror = LE_MALLOC;		return(NULL);	}	if ( hg_read_exact(sockfd, (char *)&(msg->length), 4) == -1 )  {		efree(msg);		return(NULL);	}	if ( hg_read_exact(sockfd, (char *)&(msg->version_msgid), 4) == -1 )  {		efree(msg);		return(NULL);	}	if ( hg_read_exact(sockfd, (char *)&(msg->msg_type), 4) == -1 )  {		efree(msg);		return(NULL);	}#ifdef HW_DEBUG	php_printf("<b>   Recv msg: </b>type = %d -- id = %d<br />\n", msg->msg_type, msg->version_msgid);#endif	return(msg);}hg_msg *recv_hg_msg(int sockfd){	hg_msg *msg;	if ( (msg = (hg_msg *)emalloc(sizeof(hg_msg))) == NULL )  {/*		php_printf("recv_hg_msg"); */		lowerror = LE_MALLOC;		return(NULL);	}	if ( hg_read_exact(sockfd, (char *)&(msg->length), 4) == -1 )  {/*		php_printf("recv_hg_msg: hg_read (1) returned -1\n"); */		efree(msg);		return(NULL);	}	if ( hg_read_exact(sockfd, (char *)&(msg->version_msgid), 4) == -1 )  {/*		php_printf("recv_hg_msg: hg_read (2) returned -1\n"); */		efree(msg);		return(NULL);	}	if ( hg_read_exact(sockfd, (char *)&(msg->msg_type), 4) == -1 )  {/*		php_printf("recv_hg_msg: hg_read (3) returned -1\n"); */		efree(msg);		return(NULL);	}	if ( msg->length > HEADER_LENGTH )  {		if ( (msg->buf = (char *) emalloc(msg->length-HEADER_LENGTH)) == NULL )  {/*			php_printf("recv_hg_msg"); */			lowerror = LE_MALLOC;			efree(msg);			return(NULL);		}		if ( hg_read_exact(sockfd, msg->buf, msg->length-HEADER_LENGTH) == -1 )  {/*			php_printf("recv_hg_msg: hg_read (4) returned -1\n"); */			efree(msg->buf);			efree(msg);			return(NULL);		}	}	else		msg->buf = NULL;  #ifdef HW_DEBUG	php_printf("<b>   Recv msg: </b>type = %d -- id = %d<br />\n", msg->msg_type, msg->version_msgid);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -