static void serial_uxsel_setup(Serial serial);
static void serial_try_write(Serial serial);
-static const char *serial_configure(Serial serial, Config *cfg)
+static const char *serial_configure(Serial serial, Conf *conf)
{
struct termios options;
- int bflag, bval;
+ int bflag, bval, speed, flow, parity;
const char *str;
char *msg;
/*
* Find the appropriate baud rate flag.
*/
+ speed = conf_get_int(conf, CONF_serspeed);
#define SETBAUD(x) (bflag = B ## x, bval = x)
-#define CHECKBAUD(x) do { if (cfg->serspeed >= x) SETBAUD(x); } while (0)
+#define CHECKBAUD(x) do { if (speed >= x) SETBAUD(x); } while (0)
SETBAUD(50);
#ifdef B75
CHECKBAUD(75);
sfree(msg);
options.c_cflag &= ~CSIZE;
- switch (cfg->serdatabits) {
+ switch (conf_get_int(conf, CONF_serdatabits)) {
case 5: options.c_cflag |= CS5; break;
case 6: options.c_cflag |= CS6; break;
case 7: options.c_cflag |= CS7; break;
case 8: options.c_cflag |= CS8; break;
default: return "Invalid number of data bits (need 5, 6, 7 or 8)";
}
- msg = dupprintf("Configuring %d data bits", cfg->serdatabits);
+ msg = dupprintf("Configuring %d data bits",
+ conf_get_int(conf, CONF_serdatabits));
logevent(serial->frontend, msg);
sfree(msg);
- if (cfg->serstopbits >= 4) {
+ if (conf_get_int(conf, CONF_serstopbits) >= 4) {
options.c_cflag |= CSTOPB;
} else {
options.c_cflag &= ~CSTOPB;
#ifdef CNEW_RTSCTS
options.c_cflag &= ~CNEW_RTSCTS;
#endif
- if (cfg->serflow == SER_FLOW_XONXOFF) {
+ flow = conf_get_int(conf, CONF_serflow);
+ if (flow == SER_FLOW_XONXOFF) {
options.c_iflag |= IXON | IXOFF;
str = "XON/XOFF";
- } else if (cfg->serflow == SER_FLOW_RTSCTS) {
+ } else if (flow == SER_FLOW_RTSCTS) {
#ifdef CRTSCTS
options.c_cflag |= CRTSCTS;
#endif
sfree(msg);
/* Parity */
- if (cfg->serparity == SER_PAR_ODD) {
+ parity = conf_get_int(conf, CONF_serparity);
+ if (parity == SER_PAR_ODD) {
options.c_cflag |= PARENB;
options.c_cflag |= PARODD;
str = "odd";
- } else if (cfg->serparity == SER_PAR_EVEN) {
+ } else if (parity == SER_PAR_EVEN) {
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
str = "even";
* freed by the caller.
*/
static const char *serial_init(void *frontend_handle, void **backend_handle,
- Config *cfg,
- char *host, int port, char **realhost, int nodelay,
- int keepalive)
+ Conf *conf,
+ const char *host, int port, char **realhost,
+ int nodelay, int keepalive)
{
Serial serial;
const char *err;
+ char *line;
serial = snew(struct serial_backend_data);
*backend_handle = serial;
serial->inbufsize = 0;
bufchain_init(&serial->output_data);
+ line = conf_get_str(conf, CONF_serline);
{
- char *msg = dupprintf("Opening serial device %s", cfg->serline);
+ char *msg = dupprintf("Opening serial device %s", line);
logevent(serial->frontend, msg);
+ sfree(msg);
}
- serial->fd = open(cfg->serline, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
+ serial->fd = open(line, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
if (serial->fd < 0)
return "Unable to open serial port";
cloexec(serial->fd);
- err = serial_configure(serial, cfg);
+ err = serial_configure(serial, conf);
if (err)
return err;
- *realhost = dupstr(cfg->serline);
+ *realhost = dupstr(line);
if (!serial_by_fd)
serial_by_fd = newtree234(serial_compare_by_fd);
sfree(serial);
}
-static void serial_reconfig(void *handle, Config *cfg)
+static void serial_reconfig(void *handle, Conf *conf)
{
Serial serial = (Serial) handle;
- const char *err;
-
- err = serial_configure(serial, cfg);
/*
- * FIXME: what should we do if err returns something?
+ * FIXME: what should we do if this returns an error?
*/
+ serial_configure(serial, conf);
}
static int serial_select_result(int fd, int event)
/*
* Called to send data down the serial connection.
*/
-static int serial_send(void *handle, char *buf, int len)
+static int serial_send(void *handle, const char *buf, int len)
{
Serial serial = (Serial) handle;
serial_provide_logctx,
serial_unthrottle,
serial_cfg_info,
+ NULL /* test_for_upstream */,
"serial",
PROT_SERIAL,
0