Diff for /qemu/slirp/misc.c between versions 1.1.1.11 and 1.1.1.12

version 1.1.1.11, 2018/04/24 19:31:04 version 1.1.1.12, 2018/04/24 19:51:41
Line 113  fork_exec(struct socket *so, const char  Line 113  fork_exec(struct socket *so, const char 
         struct sockaddr_in addr;          struct sockaddr_in addr;
         socklen_t addrlen = sizeof(addr);          socklen_t addrlen = sizeof(addr);
         int opt;          int opt;
         int master = -1;  
         const char *argv[256];          const char *argv[256];
         /* don't want to clobber the original */          /* don't want to clobber the original */
         char *bptr;          char *bptr;
Line 148  fork_exec(struct socket *so, const char  Line 147  fork_exec(struct socket *so, const char 
          case -1:           case -1:
                 lprint("Error: fork failed: %s\n", strerror(errno));                  lprint("Error: fork failed: %s\n", strerror(errno));
                 close(s);                  close(s);
                 if (do_pty == 2)  
                    close(master);  
                 return 0;                  return 0;
   
          case 0:           case 0:
                 setsid();                  setsid();
   
                 /* Set the DISPLAY */                  /* Set the DISPLAY */
                 if (do_pty == 2) {                  getsockname(s, (struct sockaddr *)&addr, &addrlen);
                         (void) close(master);                  close(s);
 #ifdef TIOCSCTTY /* XXXXX */                  /*
                         ioctl(s, TIOCSCTTY, (char *)NULL);                   * Connect to the socket
 #endif                   * XXX If any of these fail, we're in trouble!
                 } else {                   */
                         getsockname(s, (struct sockaddr *)&addr, &addrlen);                  s = qemu_socket(AF_INET, SOCK_STREAM, 0);
                         close(s);                  addr.sin_addr = loopback_addr;
                         /*                  do {
                          * Connect to the socket                      ret = connect(s, (struct sockaddr *)&addr, addrlen);
                          * XXX If any of these fail, we're in trouble!                  } while (ret < 0 && errno == EINTR);
                          */  
                         s = qemu_socket(AF_INET, SOCK_STREAM, 0);  
                         addr.sin_addr = loopback_addr;  
                         do {  
                             ret = connect(s, (struct sockaddr *)&addr, addrlen);  
                         } while (ret < 0 && errno == EINTR);  
                 }  
   
                 dup2(s, 0);                  dup2(s, 0);
                 dup2(s, 1);                  dup2(s, 1);
Line 210  fork_exec(struct socket *so, const char  Line 200  fork_exec(struct socket *so, const char 
   
          default:           default:
                 qemu_add_child_watch(pid);                  qemu_add_child_watch(pid);
                 if (do_pty == 2) {                  /*
                         close(s);                   * XXX this could block us...
                         so->s = master;                   * XXX Should set a timer here, and if accept() doesn't
                 } else {                   * return after X seconds, declare it a failure
                         /*                   * The only reason this will block forever is if socket()
                          * XXX this could block us...                   * of connect() fail in the child process
                          * XXX Should set a timer here, and if accept() doesn't                   */
                          * return after X seconds, declare it a failure                  do {
                          * The only reason this will block forever is if socket()                      so->s = accept(s, (struct sockaddr *)&addr, &addrlen);
                          * of connect() fail in the child process                  } while (so->s < 0 && errno == EINTR);
                          */                  closesocket(s);
                         do {                  opt = 1;
                             so->s = accept(s, (struct sockaddr *)&addr, &addrlen);                  setsockopt(so->s, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
                         } while (so->s < 0 && errno == EINTR);                  opt = 1;
                         closesocket(s);                  setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int));
                         opt = 1;                  socket_set_nonblock(so->s);
                         setsockopt(so->s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int));  
                         opt = 1;  
                         setsockopt(so->s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int));  
                 }  
                 fd_nonblock(so->s);  
   
                 /* Append the telnet options now */                  /* Append the telnet options now */
                 if (so->so_m != NULL && do_pty == 1)  {                  if (so->so_m != NULL && do_pty == 1)  {
Line 282  u_sleep(int usec) Line 267  u_sleep(int usec)
         select(0, &fdset, &fdset, &fdset, &t);          select(0, &fdset, &fdset, &fdset, &t);
 }  }
   
 /*  
  * Set fd blocking and non-blocking  
  */  
   
 void  
 fd_nonblock(int fd)  
 {  
 #ifdef FIONBIO  
 #ifdef _WIN32  
         unsigned long opt = 1;  
 #else  
         int opt = 1;  
 #endif  
   
         ioctlsocket(fd, FIONBIO, &opt);  
 #else  
         int opt;  
   
         opt = fcntl(fd, F_GETFL, 0);  
         opt |= O_NONBLOCK;  
         fcntl(fd, F_SETFL, opt);  
 #endif  
 }  
   
 void  
 fd_block(int fd)  
 {  
 #ifdef FIONBIO  
 #ifdef _WIN32  
         unsigned long opt = 0;  
 #else  
         int opt = 0;  
 #endif  
   
         ioctlsocket(fd, FIONBIO, &opt);  
 #else  
         int opt;  
   
         opt = fcntl(fd, F_GETFL, 0);  
         opt &= ~O_NONBLOCK;  
         fcntl(fd, F_SETFL, opt);  
 #endif  
 }  
   
 void slirp_connection_info(Slirp *slirp, Monitor *mon)  void slirp_connection_info(Slirp *slirp, Monitor *mon)
 {  {
     const char * const tcpstates[] = {      const char * const tcpstates[] = {
Line 348  void slirp_connection_info(Slirp *slirp, Line 289  void slirp_connection_info(Slirp *slirp,
     struct socket *so;      struct socket *so;
     const char *state;      const char *state;
     char buf[20];      char buf[20];
     int n;  
   
     monitor_printf(mon, "  Protocol[State]    FD  Source Address  Port   "      monitor_printf(mon, "  Protocol[State]    FD  Source Address  Port   "
                         "Dest. Address  Port RecvQ SendQ\n");                          "Dest. Address  Port RecvQ SendQ\n");
Line 372  void slirp_connection_info(Slirp *slirp, Line 312  void slirp_connection_info(Slirp *slirp,
             dst_addr = so->so_faddr;              dst_addr = so->so_faddr;
             dst_port = so->so_fport;              dst_port = so->so_fport;
         }          }
         n = snprintf(buf, sizeof(buf), "  TCP[%s]", state);          snprintf(buf, sizeof(buf), "  TCP[%s]", state);
         memset(&buf[n], ' ', 19 - n);          monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s,
         buf[19] = 0;  
         monitor_printf(mon, "%s %3d %15s %5d ", buf, so->s,  
                        src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",                         src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
                        ntohs(src.sin_port));                         ntohs(src.sin_port));
         monitor_printf(mon, "%15s %5d %5d %5d\n",          monitor_printf(mon, "%15s %5d %5d %5d\n",
Line 385  void slirp_connection_info(Slirp *slirp, Line 323  void slirp_connection_info(Slirp *slirp,
   
     for (so = slirp->udb.so_next; so != &slirp->udb; so = so->so_next) {      for (so = slirp->udb.so_next; so != &slirp->udb; so = so->so_next) {
         if (so->so_state & SS_HOSTFWD) {          if (so->so_state & SS_HOSTFWD) {
             n = snprintf(buf, sizeof(buf), "  UDP[HOST_FORWARD]");              snprintf(buf, sizeof(buf), "  UDP[HOST_FORWARD]");
             src_len = sizeof(src);              src_len = sizeof(src);
             getsockname(so->s, (struct sockaddr *)&src, &src_len);              getsockname(so->s, (struct sockaddr *)&src, &src_len);
             dst_addr = so->so_laddr;              dst_addr = so->so_laddr;
             dst_port = so->so_lport;              dst_port = so->so_lport;
         } else {          } else {
             n = snprintf(buf, sizeof(buf), "  UDP[%d sec]",              snprintf(buf, sizeof(buf), "  UDP[%d sec]",
                          (so->so_expire - curtime) / 1000);                           (so->so_expire - curtime) / 1000);
             src.sin_addr = so->so_laddr;              src.sin_addr = so->so_laddr;
             src.sin_port = so->so_lport;              src.sin_port = so->so_lport;
             dst_addr = so->so_faddr;              dst_addr = so->so_faddr;
             dst_port = so->so_fport;              dst_port = so->so_fport;
         }          }
         memset(&buf[n], ' ', 19 - n);          monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s,
         buf[19] = 0;  
         monitor_printf(mon, "%s %3d %15s %5d ", buf, so->s,  
                        src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",                         src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
                        ntohs(src.sin_port));                         ntohs(src.sin_port));
         monitor_printf(mon, "%15s %5d %5d %5d\n",          monitor_printf(mon, "%15s %5d %5d %5d\n",
Line 409  void slirp_connection_info(Slirp *slirp, Line 345  void slirp_connection_info(Slirp *slirp,
     }      }
   
     for (so = slirp->icmp.so_next; so != &slirp->icmp; so = so->so_next) {      for (so = slirp->icmp.so_next; so != &slirp->icmp; so = so->so_next) {
         n = snprintf(buf, sizeof(buf), "  ICMP[%d sec]",          snprintf(buf, sizeof(buf), "  ICMP[%d sec]",
                      (so->so_expire - curtime) / 1000);                       (so->so_expire - curtime) / 1000);
         src.sin_addr = so->so_laddr;          src.sin_addr = so->so_laddr;
         dst_addr = so->so_faddr;          dst_addr = so->so_faddr;
         memset(&buf[n], ' ', 19 - n);          monitor_printf(mon, "%-19s %3d %15s  -    ", buf, so->s,
         buf[19] = 0;  
         monitor_printf(mon, "%s %3d %15s  -    ", buf, so->s,  
                        src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*");                         src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*");
         monitor_printf(mon, "%15s  -    %5d %5d\n", inet_ntoa(dst_addr),          monitor_printf(mon, "%15s  -    %5d %5d\n", inet_ntoa(dst_addr),
                        so->so_rcv.sb_cc, so->so_snd.sb_cc);                         so->so_rcv.sb_cc, so->so_snd.sb_cc);

Removed from v.1.1.1.11  
changed lines
  Added in v.1.1.1.12


unix.superglobalmegacorp.com