to github
[svn42.git] / serial_console / usocket.c
index 7008090..c87b265 100644 (file)
@@ -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)