📄 hg_comm.c
字号:
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 + -