Changeset 6058

Show
Ignore:
Timestamp:
07/10/12 15:16:54 (11 months ago)
Author:
khali
Message:

libi2c: Properly propagate real error codes on read errors

Location:
i2c-tools/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • i2c-tools/trunk/CHANGES

    r6055 r6058  
    1010  i2c-stub-from-dump: Be more tolerant on input dump format 
    1111  library: New libi2c library 
     12           Properly propagate real error codes on read errors 
    1213 
    13143.1.0 (2011-12-04) 
  • i2c-tools/trunk/lib/smbus.c

    r6054 r6058  
    44    Copyright (C) 1995-97 Simon G. Vogl 
    55    Copyright (C) 1998-99 Frodo Looijaard <frodol@dds.nl> 
     6    Copyright (C) 2012    Jean Delvare <khali@linux-fr.org> 
    67 
    78    This program is free software; you can redistribute it and/or modify 
     
    2122*/ 
    2223 
     24#include <errno.h> 
    2325#include <i2c/smbus.h> 
    2426#include <sys/ioctl.h> 
     
    3941{ 
    4042        struct i2c_smbus_ioctl_data args; 
     43        __s32 err; 
    4144 
    4245        args.read_write = read_write; 
     
    4447        args.size = size; 
    4548        args.data = data; 
    46         return ioctl(file, I2C_SMBUS, &args); 
     49 
     50        err = ioctl(file, I2C_SMBUS, &args); 
     51        if (err == -1) 
     52                err = -errno; 
     53        return err; 
    4754} 
    4855 
     
    5663{ 
    5764        union i2c_smbus_data data; 
    58         if (i2c_smbus_access(file, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data)) 
    59                 return -1; 
    60         else 
    61                 return 0x0FF & data.byte; 
     65        int err; 
     66 
     67        err = i2c_smbus_access(file, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data); 
     68        if (err < 0) 
     69                return err; 
     70 
     71        return 0x0FF & data.byte; 
    6272} 
    6373 
     
    7181{ 
    7282        union i2c_smbus_data data; 
    73         if (i2c_smbus_access(file, I2C_SMBUS_READ, command, 
    74                              I2C_SMBUS_BYTE_DATA, &data)) 
    75                 return -1; 
    76         else 
    77                 return 0x0FF & data.byte; 
     83        int err; 
     84 
     85        err = i2c_smbus_access(file, I2C_SMBUS_READ, command, 
     86                               I2C_SMBUS_BYTE_DATA, &data); 
     87        if (err < 0) 
     88                return err; 
     89 
     90        return 0x0FF & data.byte; 
    7891} 
    7992 
     
    89102{ 
    90103        union i2c_smbus_data data; 
    91         if (i2c_smbus_access(file, I2C_SMBUS_READ, command, 
    92                              I2C_SMBUS_WORD_DATA, &data)) 
    93                 return -1; 
    94         else 
    95                 return 0x0FFFF & data.word; 
     104        int err; 
     105 
     106        err = i2c_smbus_access(file, I2C_SMBUS_READ, command, 
     107                               I2C_SMBUS_WORD_DATA, &data); 
     108        if (err < 0) 
     109                return err; 
     110 
     111        return 0x0FFFF & data.word; 
    96112} 
    97113 
     
    119135{ 
    120136        union i2c_smbus_data data; 
    121         int i; 
    122         if (i2c_smbus_access(file, I2C_SMBUS_READ, command, 
    123                              I2C_SMBUS_BLOCK_DATA, &data)) 
    124                 return -1; 
    125         else { 
    126                 for (i = 1; i <= data.block[0]; i++) 
    127                         values[i-1] = data.block[i]; 
    128                 return data.block[0]; 
    129         } 
     137        int i, err; 
     138 
     139        err = i2c_smbus_access(file, I2C_SMBUS_READ, command, 
     140                               I2C_SMBUS_BLOCK_DATA, &data); 
     141        if (err < 0) 
     142                return err; 
     143 
     144        for (i = 1; i <= data.block[0]; i++) 
     145                values[i-1] = data.block[i]; 
     146        return data.block[0]; 
    130147} 
    131148 
     
    152169{ 
    153170        union i2c_smbus_data data; 
    154         int i; 
    155  
    156         if (length > 32) 
    157                 length = 32; 
    158         data.block[0] = length; 
    159         if (i2c_smbus_access(file, I2C_SMBUS_READ, command, 
    160                              length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN : 
    161                               I2C_SMBUS_I2C_BLOCK_DATA, &data)) 
    162                 return -1; 
    163         else { 
    164                 for (i = 1; i <= data.block[0]; i++) 
    165                         values[i-1] = data.block[i]; 
    166                 return data.block[0]; 
    167         } 
     171        int i, err; 
     172 
     173        if (length > 32) 
     174                length = 32; 
     175        data.block[0] = length; 
     176 
     177        err = i2c_smbus_access(file, I2C_SMBUS_READ, command, 
     178                               length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN : 
     179                                I2C_SMBUS_I2C_BLOCK_DATA, &data); 
     180        if (err < 0) 
     181                return err; 
     182 
     183        for (i = 1; i <= data.block[0]; i++) 
     184                values[i-1] = data.block[i]; 
     185        return data.block[0]; 
    168186} 
    169187 
     
    187205{ 
    188206        union i2c_smbus_data data; 
    189         int i; 
     207        int i, err; 
     208 
    190209        if (length > 32) 
    191210                length = 32; 
     
    193212                data.block[i] = values[i-1]; 
    194213        data.block[0] = length; 
    195         if (i2c_smbus_access(file, I2C_SMBUS_WRITE, command, 
    196                              I2C_SMBUS_BLOCK_PROC_CALL, &data)) 
    197                 return -1; 
    198         else { 
    199                 for (i = 1; i <= data.block[0]; i++) 
    200                         values[i-1] = data.block[i]; 
    201                 return data.block[0]; 
    202         } 
    203 } 
     214 
     215        err = i2c_smbus_access(file, I2C_SMBUS_WRITE, command, 
     216                               I2C_SMBUS_BLOCK_PROC_CALL, &data); 
     217        if (err < 0) 
     218                return err; 
     219 
     220        for (i = 1; i <= data.block[0]; i++) 
     221                values[i-1] = data.block[i]; 
     222        return data.block[0]; 
     223}