diff --git a/src/sbbs3/sexyz.c b/src/sbbs3/sexyz.c index fab86dcdcd1941f2a1e861ae4acc0ef7b1fcf4e9..f766575fc76e85ea3c2c8ff66ac609af6a1ba176 100644 --- a/src/sbbs3/sexyz.c +++ b/src/sbbs3/sexyz.c @@ -332,14 +332,19 @@ void dump(BYTE* buf, int len) } } -int sock_sendbuf(SOCKET s, void *buf, size_t buflen) +int sendbuf(SOCKET s, void *buf, size_t buflen) { size_t sent=0; int ret; fd_set socket_set; for(;;) { - ret=sendsocket(s,(char *)buf+sent,buflen-sent); +#ifdef __unix__ + if(stdio) + ret=write(STDOUT_FILENO, (char *)buf+sent,buflen-sent); + else +#endif + ret=sendsocket(s,(char *)buf+sent,buflen-sent); if(ret==SOCKET_ERROR) { switch(ERROR_VALUE) { case EAGAIN: @@ -394,7 +399,7 @@ void send_telnet_cmd(SOCKET sock, uchar cmd, uchar opt) lprintf(LOG_DEBUG,"Sending telnet command: %s %s" ,telnet_cmd_desc(buf[1]),telnet_opt_desc(buf[2])); - if(sock_sendbuf(sock,buf,sizeof(buf))!=sizeof(buf) && debug_telnet) + if(sendbuf(sock,buf,sizeof(buf))!=sizeof(buf) && debug_telnet) lprintf(LOG_ERR,"FAILED"); } @@ -409,18 +414,29 @@ static int recv_buffer(int timeout) int i; fd_set socket_set; struct timeval tv; + int magic_errno; for(;;) { if(inbuf_len > inbuf_pos) return(inbuf_len-inbuf_pos); #ifdef __unix__ - if(stdio) + if(stdio) { i=read(STDIN_FILENO,inbuf,sizeof(inbuf)); + /* Look like a socket using MAGIC! */ + if(i==0) { + i=-1; + magic_errno=EAGAIN; + } + } else #endif + { i=recv(sock,inbuf,sizeof(inbuf),0); + if(i==SOCKET_ERROR) + magic_errno=ERROR_VALUE; + } if(i==SOCKET_ERROR) { - switch(ERROR_VALUE) { + switch(magic_errno) { case EAGAIN: case EINTR: #if (EAGAIN != EWOULDBLOCK) @@ -636,7 +652,7 @@ int send_byte(void* unused, uchar ch, unsigned timeout) i=write(STDOUT_FILENO,buf,len); else #endif - i=sock_sendbuf(sock,buf,len); + i=sendbuf(sock,buf,len); if(i==len) { if(debug_tx) @@ -690,12 +706,7 @@ static void output_thread(void* arg) buftop=RingBufRead(&outbuf, buf, avail); bufbot=0; } -#ifdef __unix__ - if(stdio) - i=write(STDOUT_FILENO, (char*)buf+bufbot, buftop-bufbot); - else -#endif - i=sock_sendbuf(sock, (char*)buf+bufbot, buftop-bufbot); + i=sendbuf(sock, (char*)buf+bufbot, buftop-bufbot); if(i==SOCKET_ERROR) { if(ERROR_VALUE == ENOTSOCK) lprintf(LOG_ERR,"client socket closed on send"); @@ -734,7 +745,8 @@ static void output_thread(void* arg) /* Flush output buffer */ void flush(void* unused) { - + if(stdio) + fflush(stdout); } BOOL is_connected(void* unused) @@ -1427,6 +1439,53 @@ static const char* usage= "path = directory to receive files into\n" "list = name of text file with list of filenames to send or receive\n"; +#ifdef __unix__ + +#ifdef __unix__ + struct termios tio_default; /* Initial term settings */ +#endif + +#ifdef NEEDS_CFMAKERAW +static void +cfmakeraw(struct termios *t) +{ + t->c_iflag &= ~(IMAXBEL|IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); + t->c_oflag &= ~OPOST; + t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); + t->c_cflag &= ~(CSIZE|PARENB); + t->c_cflag |= CS8; +} +#endif + +static void fixterm(void) +{ + tcsetattr(STDIN_FILENO,TCSANOW,&tio_default); +} + +static void init_stdio(void) +{ + struct termios tio_raw; + + if(isatty(STDERR_FILENO)) + fclose(stderr); + + if (isatty(STDIN_FILENO)) { + tcgetattr(STDIN_FILENO,&tio_default); + tio_raw = tio_default; + /* cfmakeraw(&tio_raw); */ + tio_raw.c_iflag &= ~(IMAXBEL|IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); + tio_raw.c_oflag &= ~OPOST; + tio_raw.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); + tio_raw.c_cflag &= ~(CSIZE|PARENB); + tio_raw.c_cflag |= CS8; + tcsetattr(STDIN_FILENO,TCSANOW,&tio_raw); + setvbuf(stdout, NULL, _IOFBF, 0); + atexit(fixterm); + } +} + +#endif + /***************/ /* Entry Point */ /***************/ @@ -1744,6 +1803,7 @@ int main(int argc, char **argv) fprintf(statfp,"No socket descriptor specified, using STDIO\n"); telnet=FALSE; + init_stdio(); #else fprintf(statfp,"!No socket descriptor specified\n\n"); fprintf(errfp,usage,MAX_FILE_SIZE);