X-Git-Url: https://git.realraum.at/?p=svn42.git;a=blobdiff_plain;f=serial_console%2Fusocket.c;h=c87b26542c6945cbb4de9ea6f7301adb85a14e89;hp=7008090b48b69040ca170fd6ba61286fc3172eea;hb=a34e51d757fe52cb19de2937ae1b211894167524;hpb=b339ede7f462ec30fd9a0487b50949a63801be9b diff --git a/serial_console/usocket.c b/serial_console/usocket.c index 7008090..c87b265 100644 --- a/serial_console/usocket.c +++ b/serial_console/usocket.c @@ -1,40 +1,5 @@ #include "usocket.h" - -int set_tty_raw(int fd, struct termios *termios_prev) -{ - struct termios tmio; - - int ret = tcgetattr(fd, &tmio); - if(ret) { - fprintf(stderr, "Error on tcgetattr(): %s\n", strerror(errno)); - return ret; - } - - memcpy(termios_prev, &tmio,sizeof(struct termios)); - - cfmakeraw(&tmio); - - ret = tcsetattr(fd, TCSANOW, &tmio); - if(ret) { - fprintf(stderr, "Error on tcsetattr(): %s\n", strerror(errno)); - return ret; - } - - fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); - - return 0; -} - -int restore_tty(int fd, struct termios *termios_prev) -{ - int ret = tcsetattr(fd, TCSANOW, termios_prev); - if(ret) { - fprintf(stderr, "Error on tcsetattr(): %s\n", strerror(errno)); - } - return ret; -} - void connect_terminal(int fd) { if (fd < 3) @@ -42,6 +7,7 @@ void connect_terminal(int fd) fd_set fds_r; char buffer[1024]; int num_byte=0; + char stdin_valid_fd=1; FD_ZERO(&fds_r); FD_SET(STDIN_FILENO,&fds_r); @@ -55,10 +21,10 @@ void connect_terminal(int fd) //~ printf("%d:%s\n",num_byte,buffer); write(STDOUT_FILENO,buffer,num_byte); } - if (num_byte == 0 || (num_byte <0 && errno != EAGAIN)) + if (num_byte < 1) return; } - if (FD_ISSET(STDIN_FILENO,&fds_r)) + if (stdin_valid_fd && FD_ISSET(STDIN_FILENO,&fds_r)) { while((num_byte = read(STDIN_FILENO,buffer, 1024)) > 0) { @@ -66,10 +32,21 @@ void connect_terminal(int fd) } if (num_byte <0 && errno != EAGAIN) return; + if (num_byte == 0) + { + if (quit_on_eof_) + return; + else + { + stdin_valid_fd=0; + FD_CLR(STDIN_FILENO,&fds_r); + } + } } - FD_SET(STDIN_FILENO,&fds_r); FD_SET(fd,&fds_r); + if (stdin_valid_fd) + FD_SET(STDIN_FILENO,&fds_r); } } @@ -92,7 +69,7 @@ int establish_socket_connection(const char* path) int len = SUN_LEN(&local); int ret = connect(fd, (struct sockaddr*) &local, len); if(ret) { - fprintf(stderr, "unable to bind to '%s': %s\n", local.sun_path, strerror(errno)); + fprintf(stderr, "unable to connect to '%s': %s\n", local.sun_path, strerror(errno)); return -1; } @@ -104,35 +81,28 @@ int main(int argc, char* argv[]) { int ret = 0; int socket_fd = 0; - //~ struct termios tmio_prev; + char *socket_file; - if (argc > 0) - socket_file_ = argv[1]; + if (argc > 1) + socket_file = argv[1]; + else + socket_file = default_socket_file_; - for(;;) + //give a second argument, to not quit on EOF on stdin. + //useful if you just want to pipe some commands to usocket with echo and then listen to stdout + if (argc > 2) + quit_on_eof_=0; + + socket_fd = establish_socket_connection(socket_file); + if(socket_fd > 0) { - socket_fd = establish_socket_connection(socket_file_); - if(socket_fd < 0) - ret = 2; - else { - //~ ret = set_tty_raw(STDIN_FILENO,&tmio_prev); - //~ if (ret) - //~ break; - fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); - connect_terminal(socket_fd); - - //~ ret = restore_tty(STDIN_FILENO,&tmio_prev); - //~ if (ret) - //~ break; - } - if (ret == 2) { - fprintf(stderr, "%s error, trying to reopen in 5 seconds..\n", socket_file_); - if(socket_fd > 0) - shutdown(socket_fd,SHUT_RDWR); - sleep(5); - } - else - break; + fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); + connect_terminal(socket_fd); + } + else + { + fprintf(stderr, "%s error, aborting..\n", socket_file); + ret=2; } if(socket_fd > 0)