"SfR Fresh" - the SfR Freeware/Shareware Archive

Member "logserial-0.4.2/sysdep1.c" of archive logserial-0.4.2.tar.gz:


As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
    1 /*
    2  * sysdep1.c	system dependant routines.
    3  *
    4  *		m_dtrtoggle	- dropt dtr and raise it again
    5  *		m_break		- send BREAK signal
    6  *		m_getdcd	- get modem dcd status
    7  *		m_setdcd	- set modem dcd status
    8  *		m_savestate	- save modem state
    9  *		m_restorestate	- restore saved modem state
   10  *		m_nohang	- tell driver not to hang up at DTR drop
   11  *		m_hupcl		- set hangup on close on/off
   12  *		m_setparms	- set baudrate, parity and number of bits.
   13  *		m_readchk	- see if there is input waiting.
   14  *		m_wait		- wait for child to finish. Sysdep. too.
   15  *
   16  *		If it's possible, Posix termios are preferred.
   17  *
   18  *		This file was part of the minicom communications package,
   19  *		Copyright 1991-1995 Miquel van Smoorenburg.
   20  *
   21  *		This file is part of the logserial package,
   22  *		Copyright 1998 Sinkovics Zoltan.
   23  *
   24  *		This program is free software; you can redistribute it and/or
   25  *		modify it under the terms of the GNU General Public License
   26  *		as published by the Free Software Foundation; either version
   27  *		2 of the License, or (at your option) any later version.
   28  */
   29 #include "sysdep.h"
   30 
   31 /* Set hardware flow control. */
   32 void m_sethwf(fd, on)
   33 int fd, on;
   34 {
   35 #ifdef _DGUX_SOURCE
   36   struct termiox x;
   37 #endif
   38 #ifdef _POSIX
   39   struct termios tty;
   40 
   41   tcgetattr(fd, &tty);
   42   if (on)
   43 	tty.c_cflag |= CRTSCTS;
   44   else
   45 	tty.c_cflag &= ~CRTSCTS;
   46   tcsetattr(fd, TCSANOW, &tty);
   47 #endif
   48 
   49 #ifdef _DGUX_SOURCE
   50   if (ioctl(fd, TCGETX, &x) < 0) {
   51 	fprintf(stderr, "can't get termiox attr.\n");
   52 	return;
   53   }
   54   x.x_hflag = on ? RTSXOFF|CTSXON : 0;
   55 
   56   if (ioctl(fd, TCSETX, &x) < 0) {
   57 	fprintf(stderr, "can't set termiox attr.\n");
   58 	return;
   59   }
   60 #endif
   61 }
   62 
   63 /* Set RTS line. Sometimes dropped. Linux specific? */
   64 void m_setrts(fd)
   65 int fd;
   66 {
   67 #if defined(TIOCM_RTS) && defined(TIOCMODG)
   68   int mcs;
   69 
   70   ioctl(fd, TIOCMODG, &mcs);
   71   mcs |= TIOCM_RTS;
   72   ioctl(fd, TIOCMODS, &mcs);
   73 #endif
   74 #ifdef _COHERENT
   75   ioctl(fd, TIOCSRTS, 0);
   76 #endif
   77 }
   78 
   79 /*
   80  * Drop DTR line and raise it again.
   81  */
   82 void m_dtrtoggle(fd)
   83 int fd;
   84 {
   85 #ifdef TIOCSDTR
   86 
   87   /* Use the ioctls meant for this type of thing. */
   88   ioctl(fd, TIOCCDTR, 0);
   89   sleep(1);
   90   ioctl(fd, TIOCSDTR, 0);
   91 
   92 #else /* TIOCSDTR */
   93 #  if defined (_POSIX) && !defined(_HPUX_SOURCE)
   94 
   95   /* Posix - set baudrate to 0 and back */
   96   struct termios tty, old;
   97 
   98   tcgetattr(fd, &tty);
   99   tcgetattr(fd, &old);
  100   cfsetospeed(&tty, B0);
  101   cfsetispeed(&tty, B0);
  102   tcsetattr(fd, TCSANOW, &tty);
  103   sleep(1);
  104   tcsetattr(fd, TCSANOW, &old);
  105 
  106 #  else /* POSIX */
  107 #    ifdef _V7
  108 
  109   /* Just drop speed to 0 and back to normal again */
  110   struct sgttyb sg, ng;
  111 
  112   ioctl(fd, TIOCGETP, &sg);
  113   ioctl(fd, TIOCGETP, &ng);
  114 
  115   ng.sg_ispeed = ng.sg_ospeed = 0;
  116   ioctl(fd, TIOCSETP, &ng);
  117   sleep(1);
  118   ioctl(fd, TIOCSETP, &sg);
  119 
  120 #    endif /* _V7 */
  121 #    ifdef _HPUX_SOURCE
  122   unsigned long mflag = 0L;
  123 
  124   ioctl(fd, MCSETAF, &mflag);
  125   ioctl(fd, MCGETA, &mflag);
  126   mflag = MRTS | MDTR;
  127   sleep(1);
  128   ioctl(fd, MCSETAF, &mflag);
  129 #    endif /* _HPUX_SOURCE */
  130 #  endif /* POSIX */
  131 #endif /* TIOCSDTR */
  132 }
  133 
  134 /*
  135  * Send a break
  136  */
  137 void m_break(fd)
  138 int fd;
  139 {
  140 #ifdef _POSIX
  141   tcsendbreak(fd, 0);
  142 #else
  143 #  ifdef _V7
  144 #    ifndef TIOCSBRK
  145   struct sgttyb sg, ng;
  146 
  147   ioctl(fd, TIOCGETP, &sg);
  148   ioctl(fd, TIOCGETP, &ng);
  149   ng.sg_ispeed = ng.sg_ospeed = B110;
  150   ng.sg_flags = BITS8 | RAW;
  151   ioctl(fd, TIOCSETP, &ng);
  152   write(fd, "\0\0\0\0\0\0\0\0\0\0", 10);
  153   ioctl(fd, TIOCSETP, &sg);
  154 #    else
  155   ioctl(fd, TIOCSBRK, 0);
  156   sleep(1);
  157   ioctl(fd, TIOCCBRK, 0);
  158 #    endif
  159 #  endif
  160 #endif
  161 }
  162 
  163 /*
  164  * Get the dcd status
  165  */
  166 int m_getdcd(fd)
  167 int fd;
  168 {
  169 #ifdef TIOCMODG
  170   int mcs;
  171 
  172   ioctl(fd, TIOCMODG, &mcs);
  173   return(mcs & TIOCM_CAR ? 1 : 0);
  174 #else
  175   (void)fd;
  176   return(0); /* Impossible!! (eg. Coherent) */
  177 #endif
  178 }
  179 
  180 /* Variables to save states in */
  181 #ifdef _POSIX
  182 static struct termios savetty;
  183 static int m_word;
  184 #else
  185 #  if defined (_BSD43) || defined (_V7)
  186 static struct sgttyb sg;
  187 static struct tchars tch;
  188 static int lsw;
  189 static int m_word;
  190 #  endif
  191 #endif
  192 
  193 /*
  194  * Save the state of a port
  195  */
  196 void m_savestate(fd)
  197 int fd;
  198 {
  199 #ifdef _POSIX
  200   tcgetattr(fd, &savetty);
  201 #else
  202 #  if defined(_BSD43) || defined(_V7)
  203   ioctl(fd, TIOCGETP, &sg);
  204   ioctl(fd, TIOCGETC, &tch);
  205 #  endif
  206 #  ifdef _BSD43
  207   ioctl(fd, TIOCLGET, &lsw);
  208 #  endif
  209 #endif
  210 #ifdef TIOCMODG
  211   ioctl(fd, TIOCMODG, &m_word);
  212 #endif
  213 }
  214 
  215 /*
  216  * Restore the state of a port
  217  */
  218 void m_restorestate(fd)
  219 int fd;
  220 {
  221 #ifdef _POSIX
  222   tcsetattr(fd, TCSANOW, &savetty);
  223 #else
  224 #  if defined(_BSD43) || defined(_V7)
  225   ioctl(fd, TIOCSETP, &sg);
  226   ioctl(fd, TIOCSETC, &tch);
  227 #  endif
  228 #  ifdef _BSD43
  229   ioctl(fd, TIOCLSET, &lsw);
  230 #  endif
  231 #endif
  232 #ifdef TIOCMODS
  233   ioctl(fd, TIOCMODS, &m_word);
  234 #endif
  235 }
  236 
  237 /*
  238  * Set the line status so that it will not kill our process
  239  * if the line hangs up.
  240  */
  241 /*ARGSUSED*/
  242 void m_nohang(fd)
  243 int fd;
  244 {
  245 #ifdef _POSIX
  246   struct termios sgg;
  247 
  248   tcgetattr(fd, &sgg);
  249   sgg.c_cflag |= CLOCAL;
  250   tcsetattr(fd, TCSANOW, &sgg);
  251 #else
  252 #  if defined (_BSD43) && defined(LNOHANG)
  253   int lsw;
  254 
  255   ioctl(fd, TIOCLGET, &lsw);
  256   lsw |= LNOHANG;
  257   ioctl(fd, TIOCLSET, &lsw);
  258 #  endif
  259 #  ifdef _COHERENT
  260   /* Doesn't know about this either, me thinks. */
  261 #  endif
  262 #endif
  263 }
  264 
  265 /*
  266  * Set hangup on close on/off.
  267  */
  268 void m_hupcl(fd, on)
  269 int fd;
  270 int on;
  271 {
  272   /* Eh, I don't know how to do this under BSD (yet..) */
  273 #ifdef _POSIX
  274   struct termios sgg;
  275 
  276   tcgetattr(fd, &sgg);
  277   if (on)
  278   	sgg.c_cflag |= HUPCL;
  279   else
  280 	sgg.c_cflag &= ~HUPCL;
  281   tcsetattr(fd, TCSANOW, &sgg);
  282 #endif
  283 }
  284 
  285 /*
  286  * Flush the buffers
  287  */
  288 void m_flush(fd)
  289 int fd;
  290 {
  291 /* Should I Posixify this, or not? */
  292 #ifdef TCFLSH
  293   ioctl(fd, TCFLSH, 2);
  294 #endif
  295 #ifdef TIOCFLUSH
  296 #ifdef _COHERENT
  297   ioctl(fd, TIOCFLUSH, 0);
  298 #else
  299   ioctl(fd, TIOCFLUSH, (void *)0);
  300 #endif
  301 #endif
  302 }
  303 
  304 /*
  305  * See if there is input waiting.
  306  * returns: 0=nothing, >0=something, -1=can't.
  307  */
  308 int m_readchk(fd)
  309 int fd;
  310 {
  311 #ifdef FIONREAD
  312   long i = -1;
  313 
  314   (void) ioctl(fd, FIONREAD, &i);
  315   return((int)i);
  316 #else
  317 #  if defined(F_GETFL) && defined(O_NDELAY)
  318   int i, old;
  319   char c;
  320 
  321   old = fcntl(fd, F_GETFL, 0);
  322   (void) fcntl(fd, F_SETFL, old | O_NDELAY);
  323   i = read(fd, &c, 1);
  324   (void) fcntl(fd, F_SETFL, old);
  325 
  326   return(i);
  327 #  else
  328   return(-1);
  329 #  endif
  330 #endif
  331 }
  332 
  333 /*
  334  * Get maximum speed.
  335  * Returns maximum speed / 100. (192-1152)
  336  */
  337 int m_getmaxspd()
  338 {
  339 #ifdef B115200
  340   return(1152);
  341 #elif defined(B57600)
  342   return(576);
  343 #elif defined(B38400)
  344   return(384);
  345 #elif defined(EXTB)
  346   return(384);
  347 #elif defined(B19200)
  348   return(192);
  349 #elif defined(EXTA)
  350   return(192);
  351 #else
  352   return(96);
  353 #endif
  354 }
  355 
  356 /*
  357  * Set baudrate, parity and number of bits.
  358  */
  359 void m_setparms(fd, baudr, par, bits, hwf, swf)
  360 int fd;
  361 char *baudr;
  362 char *par;
  363 char *bits;
  364 int hwf;
  365 int swf;
  366 {
  367   int spd = -1;
  368   int newbaud;
  369   int bit = bits[0];
  370 
  371 #ifdef _POSIX
  372   struct termios tty;
  373 
  374   tcgetattr(fd, &tty);
  375 #else /* _POSIX */
  376   struct sgttyb tty;
  377 
  378   ioctl(fd, TIOCGETP, &tty);
  379 #endif /* _POSIX */
  380 
  381   /* We generate mark and space parity ourself. */
  382   if (bit == '7' && (par[0] == 'M' || par[0] == 'S'))
  383 	bit = '8';
  384 
  385   /* Check if 'baudr' is really a number */
  386   if ((newbaud = (atol(baudr) / 100)) == 0 && baudr[0] != '0') newbaud = -1;
  387 
  388   switch(newbaud) {
  389   	case 0:
  390 #ifdef B0
  391 			spd = B0;	break;
  392 #else
  393 			spd = 0;	break;
  394 #endif
  395   	case 3:		spd = B300;	break;
  396   	case 6:		spd = B600;	break;
  397   	case 12:	spd = B1200;	break;
  398   	case 24:	spd = B2400;	break;
  399   	case 48:	spd = B4800;	break;
  400   	case 96:	spd = B9600;	break;
  401 #ifdef B19200
  402   	case 192:	spd = B19200;	break;
  403 #else /* B19200 */
  404 #  ifdef EXTA
  405 	case 192:	spd = EXTA;	break;
  406 #   else /* EXTA */
  407 	case 192:	spd = B9600;	break;
  408 #   endif /* EXTA */
  409 #endif	 /* B19200 */
  410 #ifdef B38400
  411   	case 384:	spd = B38400;	break;
  412 #else /* B38400 */
  413 #  ifdef EXTB
  414 	case 384:	spd = EXTB;	break;
  415 #   else /* EXTB */
  416 	case 384:	spd = B9600;	break;
  417 #   endif /* EXTB */
  418 #endif	 /* B38400 */
  419 #ifdef B57600
  420 	case 576:	spd = B57600;	break;
  421 #endif
  422 #ifdef B115200
  423 	case 1152:	spd = B115200;	break;
  424 #endif
  425   }
  426 
  427 #if defined (_BSD43) && !defined(_POSIX)
  428   if (spd != -1) tty.sg_ispeed = tty.sg_ospeed = spd;
  429   /* Number of bits is ignored */
  430 
  431   tty.sg_flags = RAW | TANDEM;
  432   if (par[0] == 'E')
  433 	tty.sg_flags |= EVENP;
  434   else if (par[0] == 'O')
  435 	tty.sg_flags |= ODDP;
  436   else
  437   	tty.sg_flags |= PASS8 | ANYP;
  438 
  439   ioctl(fd, TIOCSETP, &tty);
  440 
  441 #  ifdef TIOCSDTR
  442   /* FIXME: huh? - MvS */
  443   ioctl(fd, TIOCSDTR, 0);
  444 #  endif
  445 #endif /* _BSD43 && !_POSIX */
  446 
  447 #if defined (_V7) && !defined(_POSIX)
  448   if (spd != -1) tty.sg_ispeed = tty.sg_ospeed = spd;
  449   tty.sg_flags = RAW;
  450   if (par[0] == 'E')
  451 	tty.sg_flags |= EVENP;
  452   else if (par[0] == 'O')
  453 	tty.sg_flags |= ODDP;
  454 
  455   ioctl(fd, TIOCSETP, &tty);
  456 #endif /* _V7 && !POSIX */
  457 
  458 #ifdef _POSIX
  459 
  460   if (spd != -1) {
  461 	cfsetospeed(&tty, (speed_t)spd);
  462 	cfsetispeed(&tty, (speed_t)spd);
  463   }
  464 
  465   switch (bit) {
  466   	case '5':
  467   		tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5;
  468   		break;
  469   	case '6':
  470   		tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6;
  471   		break;
  472   	case '7':
  473   		tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7;
  474   		break;
  475   	case '8':
  476 	default:
  477   		tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
  478   		break;
  479   }
  480   /* Set into raw, no echo mode */
  481   tty.c_iflag =  IGNBRK;
  482   tty.c_lflag = 0;
  483   tty.c_oflag = 0;
  484   tty.c_cflag |= CLOCAL | CREAD;
  485 #ifdef _DCDFLOW
  486   tty.c_cflag &= ~CRTSCTS;
  487 #endif
  488   tty.c_cc[VMIN] = 1;
  489   tty.c_cc[VTIME] = 5;
  490 
  491   if (swf)
  492 	tty.c_iflag |= IXON | IXOFF;
  493   else
  494 	tty.c_iflag &= ~(IXON|IXOFF|IXANY);
  495 
  496   tty.c_cflag &= ~(PARENB | PARODD);
  497   if (par[0] == 'E')
  498 	tty.c_cflag |= PARENB;
  499   else if (par[0] == 'O')
  500 	tty.c_cflag |= PARODD;
  501 
  502   tcsetattr(fd, TCSANOW, &tty);
  503 
  504   m_setrts(fd);
  505 #endif /* _POSIX */
  506 
  507 #ifndef _DCDFLOW
  508   m_sethwf(fd, hwf);
  509 #endif
  510 }
  511 
  512 /*
  513  * Wait for child and return pid + status
  514  */
  515 int m_wait(stt)
  516 int *stt;
  517 {
  518 #if defined (_BSD43) && !defined(_POSIX)
  519   int pid;
  520   union wait st1;
  521 
  522   pid = wait((void *)&st1);
  523   *stt = (unsigned)st1.w_retcode + 256 * (unsigned)st1.w_termsig;
  524   return(pid);
  525 #else
  526   int pid;
  527   int st1;
  528 
  529   pid = wait(&st1);
  530   *stt = (unsigned)WEXITSTATUS(st1) + 256 * (unsigned)WTERMSIG(st1);
  531   return(pid);
  532 #endif
  533 }