[BACK]Return to rlogin.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / usr.bin / rlogin

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/usr.bin/rlogin/rlogin.c between version 1.46 and 1.47

version 1.46, 2020/05/03 16:11:06 version 1.47, 2020/05/03 16:32:16
Line 577  static pid_t ppid;
Line 577  static pid_t ppid;
 static ssize_t rcvcnt, rcvstate;  static ssize_t rcvcnt, rcvstate;
 static char rcvbuf[8 * 1024];  static char rcvbuf[8 * 1024];
   
   static int
   recvx(int fd, void *buf, size_t len, int flags, int *msgflags)
   {
           struct msghdr msg;
           struct iovec iov;
           int error;
   
           memset(&msg, 0, sizeof(msg));
           msg.msg_iov = &iov;
           iov.iov_base = buf;
           iov.iov_len = len;
           error = recvmsg(fd, &msg, flags);
           if (error)
                   return error;
           *msgflags = msg.msg_flags;
           return 0;
   }
   
 static void  static void
 oob(int signo)  oob(int signo)
 {  {
         struct termios tty;          struct termios tty;
         int atmark;          int atmark = 0;
         ssize_t n, rcvd;          ssize_t n, rcvd;
         char waste[BUFSIZ], mark;          char waste[BUFSIZ], mark;
   
         rcvd = 0;          rcvd = 0;
         while (recv(rem, &mark, 1, MSG_OOB) == -1) {          while (recvx(rem, &mark, 1, MSG_OOB, &atmark) == -1) {
                 switch (errno) {                  switch (errno) {
                 case EWOULDBLOCK:                  case EWOULDBLOCK:
                         /*                          /*
Line 610  oob(int signo)
Line 628  oob(int signo)
                         return;                          return;
                 }                  }
         }          }
           atmark &= MSG_OOB;
         if (mark & TIOCPKT_WINDOW) {          if (mark & TIOCPKT_WINDOW) {
                 /* Let server know about window size changes */                  /* Let server know about window size changes */
                 (void)kill(ppid, SIGUSR1);                  (void)kill(ppid, SIGUSR1);
Line 626  oob(int signo)
Line 645  oob(int signo)
         }          }
         if (mark & TIOCPKT_FLUSHWRITE) {          if (mark & TIOCPKT_FLUSHWRITE) {
                 (void)tcflush(1, TCIOFLUSH);                  (void)tcflush(1, TCIOFLUSH);
                 for (;;) {                  if (!atmark)
                         if (ioctl(rem, SIOCATMARK, &atmark) < 0) {  
                                 warn("ioctl SIOCATMARK (ignored)");  
                                 break;  
                         }  
                         if (atmark)  
                                 break;  
                         n = read(rem, waste, sizeof (waste));                          n = read(rem, waste, sizeof (waste));
                         if (n <= 0)  
                                 break;  
                 }  
                 /*                  /*
                  * Don't want any pending data to be output, so clear the recv                   * Don't want any pending data to be output, so clear the recv
                  * buffer.  If we were hanging on a write when interrupted,                   * buffer.  If we were hanging on a write when interrupted,

Legend:
Removed from v.1.46  
changed lines
  Added in v.1.47

CVSweb <webmaster@jp.NetBSD.org>