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:  /* Теперь перейти на сторону локального терминала */

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату