Module: xenomai-3
Branch: next
Commit: 522dc5d6cf8f58fee5f489f5c2736ff1ddb84703
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=522dc5d6cf8f58fee5f489f5c2736ff1ddb84703

Author: Jorge Ramirez-Ortiz <j...@xenomai.org>
Date:   Fri Aug  7 09:34:41 2015 -0400

lib/analogy: check for errors in the calibration file

Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-or...@linaro.org>

---

 lib/analogy/calibration.c |   29 +++++++++++++++++++++--------
 utils/analogy/insn_read.c |    2 +-
 2 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/lib/analogy/calibration.c b/lib/analogy/calibration.c
index 14ca454..b50cb2f 100644
--- a/lib/analogy/calibration.c
+++ b/lib/analogy/calibration.c
@@ -30,6 +30,12 @@
 #include "boilerplate/list.h"
 #include "calibration.h"
 
+#define CHK(func, ...)                                                         
\
+do {                                                                           
\
+       int rc = func(__VA_ARGS__);                                             
\
+       if (rc < 0)                                                             
\
+               return -1;                                                      
\
+} while (0)
 
 #define ARRAY_LEN(a)  (sizeof(a) / sizeof((a)[0]))
 
@@ -212,12 +218,19 @@ int a4l_read_calibration_file(char *name, struct 
a4l_calibration_data *data)
        if (d == NULL)
                return -1;
 
-       read_str(&data->driver_name, d, PLATFORM_STR, DRIVER_STR);
-       read_str(&data->board_name, d, PLATFORM_STR, BOARD_STR);
+       CHK(read_str, &data->driver_name, d, PLATFORM_STR, DRIVER_STR);
+       CHK(read_str, &data->board_name, d, PLATFORM_STR, BOARD_STR);
 
        for (k = 0; k < ARRAY_LEN(subdevice); k++) {
                read_int(&nb_elements, d, subdevice[k], -1, ELEMENTS_STR);
-               read_int(&index, d, subdevice[k], -1, INDEX_STR);
+               if (nb_elements < 0 ) {
+                       /* AO is optional */
+                       if (!strncmp(subdevice[k], AO_SUBD_STR, 
sizeof(AO_SUBD_STR)))
+                            break;
+                       return -1;
+               }
+
+               CHK(read_int, &index, d, subdevice[k], -1, INDEX_STR);
 
                if (strncmp(subdevice[k], AI_SUBD_STR,
                            strlen(AI_SUBD_STR)) == 0) {
@@ -236,19 +249,19 @@ int a4l_read_calibration_file(char *name, struct 
a4l_calibration_data *data)
                }
 
                for (i = 0; i < nb_elements; i++) {
-                       read_int(&p->expansion, d, subdevice[k], i,
+                       CHK(read_int, &p->expansion, d, subdevice[k], i,
                                 EXPANSION_STR);
-                       read_int(&p->nb_coeff, d, subdevice[k], i,
+                       CHK(read_int, &p->nb_coeff, d, subdevice[k], i,
                                 NBCOEFF_STR);
-                       read_int(&p->channel, d, subdevice[k], i,
+                       CHK(read_int, &p->channel, d, subdevice[k], i,
                                 CHANNEL_STR);
-                       read_int(&p->range, d, subdevice[k], i,
+                       CHK(read_int, &p->range, d, subdevice[k], i,
                                 RANGE_STR);
 
                        p->coeff = malloc(p->nb_coeff * sizeof(double));
 
                        for (j = 0; j < p->nb_coeff; j++) {
-                               read_dbl(&p->coeff[j], d, subdevice[k], i,
+                               CHK(read_dbl,&p->coeff[j], d, subdevice[k], i,
                                         COEFF_STR, j);
                        }
 
diff --git a/utils/analogy/insn_read.c b/utils/analogy/insn_read.c
index 8d457ed..8aa0740 100644
--- a/utils/analogy/insn_read.c
+++ b/utils/analogy/insn_read.c
@@ -223,7 +223,7 @@ static int dump_calibrated(a4l_desc_t *dsc, unsigned char 
*buf, int size)
        err = a4l_read_calibration_file(calibration_file, &cal_info);
        if (err < 0) {
                fprintf(stderr,
-                       "insn_read: failed to read /tmp/calibration.txt \n");
+                       "insn_read: error reading the calibration file \n");
                goto out;
        }
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to