100: in_escape = 1;
101: return;
102: }
103: send_escape(fd, buf[current]);
104: }
105: num -= current;
106: buf += current;
107: current = 0;
108: }
109: return;
110: }
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, NULL, ' ', 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
',
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: /* Теперь перейти на сторону локального терминала */
