Разработка приложений в среде Linux. Второе издание
Шрифт:
66: tcsendbreak(fd, 0);
67: break;
68: default:
69: /* пропустить символ */
70: /* "C-\ C-\" sends "C-\" */
71: write(fd, &c, 1);
72: break;
73: }
74: return;
75: }
76:
77: /* обработать управляющие символы, записывая их в вывод */
78: void cook_buf(int fd, char * buf, int num) {
79: int current = 0;
80: static int in_escape = 0;
81:
82: if (in_escape) {
83: /* cook_buf
последний раз вызывался с незавершенной
84: управляющей последовательностью */
85: send_escape(fd, buf[0]);
86: num--;
87: buf++;
88: in_escape = 0;
89: }
90: while (current < num) {
91: # define CTRLCHAR(c) ((c)-0x40)
92: while ((current < num) && (buf[current] != CTRLCHAR('W')))
93: current++;
94: if (current) write (fd, buf, current);
95: if (current < num) {
96: /* найден управляющий символ */
97: current++;
98: if (current >= num) {
99: /*интерпретировать первый символ следующей последовательности*/
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', 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);
Поделиться с друзьями: