Exemple #1
0
SOL_API int
sol_util_replace_str_from_slice_if_changed(char **str,
    const struct sol_str_slice slice)
{
    SOL_NULL_CHECK(str, -EINVAL);

    if (!slice.len) {
        free(*str);
        *str = NULL;
        return 0;
    }

    if (*str) {
        char *tmp = *str;
        size_t str_len = strlen(*str);

        if (str_len == slice.len && memcmp(*str, slice.data, str_len) == 0) {
            return 0;
        } else if (str_len < slice.len) {
            tmp = realloc(*str, slice.len + 1);
            SOL_NULL_CHECK(tmp, -ENOMEM);
        }
        memcpy(tmp, slice.data, slice.len);
        tmp[slice.len] = '\0';
        *str = tmp;
    } else {
        *str = sol_str_slice_to_string(slice);
        SOL_NULL_CHECK(*str, -ENOMEM);
    }

    return 0;
}
Exemple #2
0
static int
sol_mavlink_init_tcp(struct sol_mavlink *mavlink)
{
    struct hostent *server;
    struct sockaddr_in serveraddr = { 0 };
    char *hostname;
    int err, tcp_flag = 1;

    mavlink->fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
    if (mavlink->fd == -1) {
        SOL_ERR("Could not create a socket to specified address - %s",
            sol_util_strerrora(errno));
        return -errno;
    }

    hostname = sol_str_slice_to_string(*mavlink->address);
    if (!hostname) {
        SOL_ERR("Could not format hostname string - %s",
            sol_util_strerrora(errno));
        goto err;
    }

    server = gethostbyname(hostname);
    if (!server) {
        SOL_ERR("No such host: %s - (%s)", hostname,
            sol_util_strerrora(h_errno));
        errno = h_errno;
        goto err;
    }

    serveraddr.sin_family = AF_INET;
    memcpy(server->h_addr, &serveraddr.sin_addr.s_addr, server->h_length);
    serveraddr.sin_port = htons(mavlink->port);

    err = setsockopt
            (mavlink->fd, IPPROTO_TCP, TCP_NODELAY, &tcp_flag, sizeof(int));
    if (err < 0) {
        SOL_ERR("Could not set NODELAY option to tcp socket - (%s)",
            sol_util_strerrora(errno));
        goto sock_err;
    }

    err = connect(mavlink->fd, &serveraddr, sizeof(serveraddr));
    if (err < 0) {
        SOL_ERR("Could not stablish connection to: %s:%d - (%s)", hostname,
            mavlink->port, sol_util_strerrora(errno));
        goto sock_err;
    }

    free(hostname);
    return 0;

sock_err:
    free(hostname);
err:
    close(mavlink->fd);
    return -errno;
}
Exemple #3
0
static int
sol_mavlink_init_serial(struct sol_mavlink *mavlink)
{
    struct termios tty = { 0 };
    char *portname;
    int baud_rate;

    baud_rate = mavlink->config->baud_rate;
    if (!baud_rate) {
        baud_rate = 115200;
        SOL_INF("No baud_rate config provided, setting default: 115200");
    }

    portname = sol_str_slice_to_string(*mavlink->address);
    if (!portname) {
        SOL_ERR("Could not format portname string - %s",
            sol_util_strerrora(errno));
        return -errno;
    }

    mavlink->fd = open(portname, O_RDWR | O_NOCTTY | O_SYNC | O_CLOEXEC);
    if (mavlink->fd == -1) {
        SOL_ERR("Could not open serial port: %s - %s", portname,
            sol_util_strerrora(errno));
        goto err;
    }

    if (tcgetattr(mavlink->fd, &tty) != 0) {
        SOL_ERR("Could not read serial attr: %s", sol_util_strerrora(errno));
        goto attr_err;
    }

    if (cfsetospeed(&tty, baud_rate) == -1) {
        SOL_ERR("Could not set serial output speed - %s",
            sol_util_strerrora(errno));
        goto attr_err;
    }

    if (cfsetispeed(&tty, baud_rate) == -1) {
        SOL_ERR("Could not set serial input speed - %s",
            sol_util_strerrora(errno));
        goto attr_err;
    }

    tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
    tty.c_iflag &= ~IGNBRK;
    tty.c_lflag = 0;
    tty.c_oflag = 0;
    tty.c_cc[VMIN]  = 0;
    tty.c_iflag &= ~(IXON | IXOFF | IXANY);
    tty.c_cflag |= (CLOCAL | CREAD);
    tty.c_cflag &= ~(PARENB | PARODD);
    tty.c_cflag |= 0;
    tty.c_cflag &= ~CSTOPB;
    tty.c_cflag &= ~CRTSCTS;

    if (tcsetattr(mavlink->fd, TCSANOW, &tty) != 0) {
        SOL_ERR("Could not set serial attr: %s", sol_util_strerrora(errno));
        goto attr_err;
    }

    free(portname);
    return 0;

attr_err:
    close(mavlink->fd);
err:
    free(portname);
    return -errno;
}