Чтение онлайн

ЖАНРЫ

Разработка приложений в среде 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);

Поделиться с друзьями: