diff -r af21f0bdc7c9 -r 2b9c78543663 lib/voe_handler.c --- a/lib/voe_handler.c Thu Sep 06 14:21:02 2012 +0200 +++ b/lib/voe_handler.c Mon Nov 03 15:20:05 2014 +0100 @@ -1,11 +1,11 @@ /****************************************************************************** - * + * * $Id$ - * - * Copyright (C) 2006-2009 Florian Pose, Ingenieurgemeinschaft IgH - * + * + * Copyright (C) 2006-2012 Florian Pose, Ingenieurgemeinschaft IgH + * * This file is part of the IgH EtherCAT master userspace library. - * + * * The IgH EtherCAT master userspace library is free software; you can * redistribute it and/or modify it under the terms of the GNU Lesser General * Public License as published by the Free Software Foundation; version 2.1 @@ -19,9 +19,9 @@ * You should have received a copy of the GNU Lesser General Public License * along with the IgH EtherCAT master userspace library. If not, see * . - * + * * --- - * + * * The license mentioned above concerns the source code only. Using the * EtherCAT technology and brand is only permitted in compliance with the * industrial property and similar rights of Beckhoff Automation GmbH. @@ -35,22 +35,21 @@ /*****************************************************************************/ #include -#include #include -#include #include +#include "ioctl.h" #include "voe_handler.h" #include "slave_config.h" #include "master.h" -#include "master/ioctl.h" /*****************************************************************************/ void ec_voe_handler_clear(ec_voe_handler_t *voe) { - if (voe->data) + if (voe->data) { free(voe->data); + } } /*****************************************************************************/ @@ -59,15 +58,18 @@ uint16_t vendor_type) { ec_ioctl_voe_t data; + int ret; data.config_index = voe->config->index; data.voe_index = voe->index; data.vendor_id = &vendor_id; data.vendor_type = &vendor_type; - if (ioctl(voe->config->master->fd, EC_IOCTL_VOE_SEND_HEADER, &data) == -1) + ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_SEND_HEADER, &data); + if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to set VoE send header: %s\n", - strerror(errno)); + strerror(EC_IOCTL_ERRNO(ret))); + } } /*****************************************************************************/ @@ -76,15 +78,18 @@ uint32_t *vendor_id, uint16_t *vendor_type) { ec_ioctl_voe_t data; + int ret; data.config_index = voe->config->index; data.voe_index = voe->index; data.vendor_id = vendor_id; data.vendor_type = vendor_type; - if (ioctl(voe->config->master->fd, EC_IOCTL_VOE_REC_HEADER, &data) == -1) + ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_REC_HEADER, &data); + if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to get received VoE header: %s\n", - strerror(errno)); + strerror(EC_IOCTL_ERRNO(ret))); + } } /*****************************************************************************/ @@ -106,13 +111,16 @@ void ecrt_voe_handler_read(ec_voe_handler_t *voe) { ec_ioctl_voe_t data; - - data.config_index = voe->config->index; - data.voe_index = voe->index; - - if (ioctl(voe->config->master->fd, EC_IOCTL_VOE_READ, &data) == -1) + int ret; + + data.config_index = voe->config->index; + data.voe_index = voe->index; + + ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_READ, &data); + if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to initiate VoE reading: %s\n", - strerror(errno)); + strerror(EC_IOCTL_ERRNO(ret))); + } } /*****************************************************************************/ @@ -120,13 +128,16 @@ void ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe) { ec_ioctl_voe_t data; - - data.config_index = voe->config->index; - data.voe_index = voe->index; - - if (ioctl(voe->config->master->fd, EC_IOCTL_VOE_READ_NOSYNC, &data) == -1) + int ret; + + data.config_index = voe->config->index; + data.voe_index = voe->index; + + ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_READ_NOSYNC, &data); + if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to initiate VoE reading: %s\n", - strerror(errno)); + strerror(EC_IOCTL_ERRNO(ret))); + } } /*****************************************************************************/ @@ -134,15 +145,18 @@ void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) { ec_ioctl_voe_t data; + int ret; data.config_index = voe->config->index; data.voe_index = voe->index; data.size = size; data.data = voe->data; - if (ioctl(voe->config->master->fd, EC_IOCTL_VOE_WRITE, &data) == -1) + ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_WRITE, &data); + if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to initiate VoE writing: %s\n", - strerror(errno)); + strerror(EC_IOCTL_ERRNO(ret))); + } } /*****************************************************************************/ @@ -150,33 +164,31 @@ ec_request_state_t ecrt_voe_handler_execute(ec_voe_handler_t *voe) { ec_ioctl_voe_t data; - - data.config_index = voe->config->index; - data.voe_index = voe->index; - - if (ioctl(voe->config->master->fd, EC_IOCTL_VOE_EXEC, &data) == -1) { + int ret; + + data.config_index = voe->config->index; + data.voe_index = voe->index; + + ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_EXEC, &data); + if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to execute VoE handler: %s\n", - strerror(errno)); + strerror(EC_IOCTL_ERRNO(ret))); return EC_REQUEST_ERROR; } if (data.size) { // new data waiting to be copied if (voe->mem_size < data.size) { - if (voe->data) - free(voe->data); - voe->data = malloc(data.size); - if (!voe->data) { - voe->mem_size = 0; - fprintf(stderr, "Failed to allocate VoE data memory!"); - return EC_REQUEST_ERROR; - } - voe->mem_size = data.size; + fprintf(stderr, "Received %zu bytes do not fit info VoE data" + " memory (%zu bytes)!\n", data.size, voe->mem_size); + return EC_REQUEST_ERROR; } data.data = voe->data; - if (ioctl(voe->config->master->fd, EC_IOCTL_VOE_DATA, &data) == -1) { - fprintf(stderr, "Failed to get VoE data: %s\n", strerror(errno)); + ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_DATA, &data); + if (EC_IOCTL_IS_ERROR(ret)) { + fprintf(stderr, "Failed to get VoE data: %s\n", + strerror(EC_IOCTL_ERRNO(ret))); return EC_REQUEST_ERROR; } voe->data_size = data.size;