111:
112: int main(int argc, const char * argv[]) {
113: char Ρ; /* ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² */
114: struct termios pts; /* Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios Π΄Π»Ρ ΠΏΠΎΡΡΠ° */
115: struct termios sts; /* Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios Π΄Π»Ρ stdout/stdin */
116: const char *portname;
117: int speed = 0; /* ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΡΠ°Π·Π±ΠΎΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠΊΠΎΡΠΎΡΡΠΈ */
118: struct sigaction sact; /* ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² */
119: struct pollfd ufds[2]; /* Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ poll() */
120: int raw = 0; /* Π½Π΅ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ? */
121: int flow = 0; /* ΡΠΈΠΏ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, Π΅ΡΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ*/
122: int crnl = 0; /* ΠΏΠΎΡΡΠ»Π°ΡΡ Π»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ» Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΊΠ°ΡΠ΅ΡΠΊΠΈ Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ? */
123: int i = 0; /* ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΠΈΠΊΠ»Π΅ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ*/
124: int done = 0; 125: # define BUFSIZE 1024
126: char buf[BUFSIZE];
127: poptContext optCon; /* ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΎΠΏΡΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ */
128: struct poptOption optionsTable[] = {
129: { "bps", 'b', POPT_ARG_INT, &speed, 0,
130: "ΡΠΊΠΎΡΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², Π±ΠΈΡ/Ρ",
131: "<BPS>" },
132: { "crnl", 'Ρ', POPT_ARG_VAL, &crnl, 'Ρ',
133: "ΠΏΠΎΡΡΠ»Π°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ» Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΊΠ°ΡΠ΅ΡΠΊΠΈ Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ", NULL },
134: { "hwflow", 'h', POPT_ARG_VAL, &flow, 'h',
135: "ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠΌ", NULL },
136: { "swflow", 's', POPT_ARG_VAL, &flow, 's',
137: "ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠΌ", NULL },
138: { "noflow", 'n', POPT_ARG_VAL, &flow, 'n',
139: "ΠΎΡΠΊΠ»ΡΡΠΈΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠΌ", NULL },
140: { "raw", 'r', POPT_ARG_VAL, &raw, 1,
141: "Π²ΠΊΠ»ΡΡΠΈΡΡ Π½Π΅ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ", NULL },
142: POPT_AUTOHELP
143: { NULL, '\0', 0, NULL, '\0', NULL, NULL }
144: };
145:
146: #ifdef DSLEEP
147: /* ΠΎΠΆΠΈΠ΄Π°ΡΡ 10 ΠΌΠΈΠ½ΡΡ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ */
148: sleep(600);
149: #endif
150:
151: optCon = poptGetContext("robin", argc, argv, optionsTable, 0);
152: poptSetOtherOptionHelp(optCon, "<port>");
153:
154: if (argc < 2) {
155: poptPrintUsage(optCon, stderr, 0);
156: die(1, "He Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²", "");
157: }
158:
159: if ((Ρ = poptGetNextOpt(optCon)) < -1) {
160: /* ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΠΏΡΠΈΠΉ */
161: fprintf(stderr, "%s: %s\n",
162: poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
163: poptStrerror(c));
164: return 1;
165: }
166: portname = poptGetArg(optCon);
167: if (!portname) {
168: poptPrintUsage(optCon, stderr, 0);
169: die(1, "He ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΈΠΌΡ ΠΏΠΎΡΡΠ°", "");
170: }
171:
172: pf = open(portname, O_RDWR);
173: if (pf < 0) {
174: poptPrintUsage(optCon, stderr, 0);
175: die(1, strerror(errno), portname);
176: }
177: poptFreeContext(optCon);
178:
179: /* ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΠΎΡΡΠ° */
180: tcgetattr(pf, &pts);
181: pots = pts;
182: /* Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎ */
183: pts.c_lflag &= ~ICANON;
184: pts.c_lflag &= ~(ECHO | ECHOCTL | ECHONL);
185: pts.c_cflag |= HUPCL;
186: pts.c_cc[VMIN] = 1;
187: pts.c_cc[VTIME] = 0;
188:
189: /* Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° CR/LF: ΡΡΠΎ Π½Π΅ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠΌΠΈΠ½Π°Π».
190: * ΠΠ΅ ΡΡΠ°Π½ΡΠ»ΠΈΡΡΠ΅ΡΡΡ:
191: * Π½Π΅Ρ NL -> ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ CR/NL Π² Π²ΡΠ²ΠΎΠ΄Π΅,
192: * Π½Π΅Ρ CR -> ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ NL Π²ΠΎ Π²Π²ΠΎΠ΄Π΅.
193: */
194: pts.c_oflag &= ~ONLCR;
195: pts.c_iflag &= ~ICRNL;
196:
197: /* Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° ΡΡΠΎΡΠΎΠ½Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° */
198: tcgetattr(STDIN_FILENO, &sts);
199: sots = sts;
200: /* ΠΈ ΡΠ½ΠΎΠ²Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ */
201: sts.c_iflag &= ~(BRKINT | ICRNL);
202: sts.c_iflag |= IGNBRK;
203: sts.c_lflag &= ~ISIG;
204: sts.c_cc[VMIN] = 1;
205: sts.c_cc[VTIME] = 0;
206: sts.c_lflag &= ~ICANON;
207: /* Π½Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡ ΠΎ: ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΡΡ ΠΎ-ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ */
208: sts.c_lflag &= ~(ECHO | ECHOCTL | ECHONL);
209:
210: /* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΠΏΡΠΈΠΉ ΡΠ΅ΠΉΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ pts ΠΈ sts */
211: switch (flow) {
212: case 'h' :
213: /* Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠΌ */
214: pts.c_cflag |= CRTSCTS;
215: pts.c_iflag &= ~(IXON | IXOFF | IXANY);
216: break;
217: case 's':
218: /* ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠΌ */
219: pts.c_cflag &= ~CRTSCTS;
220: pts.c_iflag |= IXON | IXOFF | IXANY;
221: break;
222: case 'n':
223: /* ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠΌ */
224: pts.c_cflag &= ~CRTSCTS;
225: pts.c_iflag &= ~(IXON | IXOFF | IXANY);
226: break;
227: }
228: if (crnl) {
229: /* ΠΏΠΎΡΠ»Π°ΡΡ CR Ρ NL */
230: pts.c_oflag |= ONLCR;
231: }
232:
233: /* ΡΠΊΠΎΡΠΎΡΡΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°Π½ΠΎ -b */
234: if (speed) {
235: cfsetospeed(&pts, symbolic_speed(speed));
236: cfsetispeed(&pts, symbolic_speed(speed));
237: }
238:
239: /* ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ
240: * ΡΡΠ°ΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° termios */
241: sact.sa_handler = cleanup_termios;
242: sigaction(SIGHUP, &sact, NULL);
243: sigaction(SIGINT, &sact, NULL);
244: sigaction(SIGPIPE, &sact, NULL);
245: sigaction(SIGTERM, &sact, NULL);
246:
247: /* ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios */
248: tcsetattr(pf, TCSANOW, &pts);
249: tcsetattr(STDIN_FILENO, TCSANOW, &sts);
250:
251: ufds[0].fd = STDIN_FILENO;
252: ufds[0].events = POLLIN;
253: ufds[1].fd = pf;
254: ufds[1].events = POLLIN;
255:
256: do {
257: int r;
258:
259: r = poll(ufds, 2, -1);
260: if ((r < 0) && (errno != EINTR))
261: die(1, "Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΉ ΡΠ±ΠΎΠΉ poll", "");
262:
263: /* ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ */
264: if ((ufds[0].revents | ufds[1].revents) &
265: (POLLERR | POLLHUP | POLLNVAL)) {
266: done = 1;
267: break;
268: }
269:
270: if (ufds[1].revents & POLLIN) {
271: /* pf ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ */
272: i = read (pf, buf, BUFSIZE);
273: if (i >= 1) {
274: write(STDOUT_FILENO, buf, i);
275: } else {
276: done = 1;
277: }
278: }
279: if (ufds[0].revents & POLLIN) {
280: /* ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²Π²ΠΎΠ΄ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ */
281: i = read(STDIN_FILENO, buf, BUFSIZE);
282: if (i >= 1) {
283: if (raw) {
284: write(pf, buf, i);
285: } else {
286: cook_buf(pf, buf, i);
287: }
288: } else {
289: done = 1;
290: }
291: }
292: } while (!done);
293:
294: /* Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ*/
295: tcsetattr(pf, TCSANOW, &pots);
296: tcsetattr(STDIN_FILENO, TCSANOW, &sots);
297: exit(0);
298: }
ΠΠΎΠ΄ robin.Ρ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² (ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ man-ΡΡΡΠ°Π½ΠΈΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ), Π° Π·Π°ΡΠ΅ΠΌ Π² Π½Π΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
Π€ΡΠ½ΠΊΡΠΈΡ symbolic_speed() Π² ΡΡΡΠΎΠΊΠ΅ 19 ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠΊΠΎΡΠΎΡΡΡ Π² ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ termios. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, termios Π½Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌΠΈ ΡΠΊΠΎΡΠΎΡΡΡΠΌΠΈ, ΡΠ°ΠΊ ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΠΊΠΎΡΠΎΡΡΡ, ΠΊΠΎΡΠΎΡΡΡ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ°ΡΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ β ΡΠ΄ΡΠΎ[110].
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Ρ ΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π²ΡΡΠΎΠΊΠΈΠ΅ ΡΠΊΠΎΡΠΎΡΡΠΈ. ΠΠ΅ Π²ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠΊΠΎΡΠΎΡΡΠΈ 230 400 ΠΈΠ»ΠΈ 460 800 Π±ΠΈΡ/Ρ; Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ POSIX ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΡΠΊΠΎΡΠΎΡΡΠΈ Π»ΠΈΡΡ Π΄ΠΎ 38 400 Π±ΠΈΡ/Ρ. Π§ΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΠΉ, ΠΊΠ°ΠΆΠ΄ΡΡ ΡΡΡΠΎΠΊΡ Π½Π°Π΄ ΡΡΡΠΎΠΊΠΎΠΉ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠΊΠΎΡΠΎΡΡΡ 38 400 Π±ΠΈΡ/Ρ, ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°ΡΡΠΈΡΠΈΡΡ Π΄ΠΎ ΡΡΠ΅Ρ ΡΡΡΠΎΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:
#ifdef Π460800
if (speednum >= 460800) return B46000;
#end if
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠΊΠΎΡΠΎΡΡΠΈ Π²ΡΡΠ΅ ΡΠ΅Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΡΡΡ ΡΠΏΠΎΡΠΎΠ±Π½Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ, Π° ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΅ΠΏΠ΅ΡΡ Π±ΡΠ΄Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² Π»ΡΠ±ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Ρ POSIX termios. (ΠΠ°ΠΊ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ ΡΠ°Π½Π΅Π΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅, Π»ΡΠ±ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΡΠΈΠ½ΡΡΡ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π»ΡΠ±ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ termios, ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ Π½Π΅ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΊΠΎΡΠΎΡΡΠΈ. ΠΠΎΡΡΠΎΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° B460800 Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΡΡΠ° ΡΠ°Π²Π½ΠΎΠΉ 460 800 Π±ΠΈΡ/Ρ.)
Π ΡΡΡΠΎΠΊΠ°Ρ 44β55 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΈ ΡΠ°ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ termios Π½Π° ΠΎΠ±ΠΎΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°Ρ tty ΠΏΡΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠ΅ ΡΠΈΠ³Π½Π°Π»Π°, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΡΡΠΊΡΡΡΠ°ΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΌ ΡΡΠ°ΡΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ termios. ΠΠΌΡ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΡ (ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ Π½Π΅ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ Π² Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ). ΠΡΠΎΡ ΠΊΠΎΠ΄ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅Π½ ΠΊΠΎΠ΄Ρ Π² ΡΠ»ΡΡΠ°Π΅ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»ΡΠ΅ΡΡΡ ΠΊ ΡΠΈΠ³Π½Π°Π»Π°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π²Π΅ΡΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Ρ.