"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 }