Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/file_bd/file_bd.c

    r1e4cada red903174  
    4848#include <devmap.h>
    4949#include <sys/types.h>
     50#include <sys/typefmt.h>
    5051#include <errno.h>
    5152#include <bool.h>
     
    5657
    5758static const size_t block_size = 512;
     59static aoff64_t num_blocks;
    5860static FILE *img;
    5961
     
    99101{
    100102        int rc;
     103        long img_size;
    101104
    102105        rc = devmap_driver_register(NAME, file_bd_connection);
     
    109112        if (img == NULL)
    110113                return EINVAL;
     114
     115        if (fseek(img, 0, SEEK_END) != 0) {
     116                fclose(img);
     117                return EIO;
     118        }
     119
     120        img_size = ftell(img);
     121        if (img_size < 0) {
     122                fclose(img);
     123                return EIO;
     124        }
     125
     126        num_blocks = img_size / block_size;
    111127
    112128        fibril_mutex_initialize(&dev_lock);
     
    174190                        ipc_answer_1(callid, EOK, block_size);
    175191                        continue;
     192                case BD_GET_NUM_BLOCKS:
     193                        ipc_answer_2(callid, EOK, LOWER32(num_blocks),
     194                            UPPER32(num_blocks));
     195                        continue;
    176196                default:
    177197                        retval = EINVAL;
     
    186206{
    187207        size_t n_rd;
     208        int rc;
     209
     210        /* Check whether access is within device address bounds. */
     211        if (ba + cnt > num_blocks) {
     212                printf(NAME ": Accessed blocks %" PRIuOFF64 "-%" PRIuOFF64 ", while "
     213                    "max block number is %" PRIuOFF64 ".\n", ba, ba + cnt - 1,
     214                    num_blocks - 1);
     215                return ELIMIT;
     216        }
    188217
    189218        fibril_mutex_lock(&dev_lock);
    190219
    191         fseek(img, ba * block_size, SEEK_SET);
     220        clearerr(img);
     221        rc = fseek(img, ba * block_size, SEEK_SET);
     222        if (rc < 0) {
     223                fibril_mutex_unlock(&dev_lock);
     224                return EIO;
     225        }
     226
    192227        n_rd = fread(buf, block_size, cnt, img);
    193228
     
    209244{
    210245        size_t n_wr;
     246        int rc;
     247
     248        /* Check whether access is within device address bounds. */
     249        if (ba + cnt > num_blocks) {
     250                printf(NAME ": Accessed blocks %" PRIuOFF64 "-%" PRIuOFF64 ", while "
     251                    "max block number is %" PRIuOFF64 ".\n", ba, ba + cnt - 1,
     252                    num_blocks - 1);
     253                return ELIMIT;
     254        }
    211255
    212256        fibril_mutex_lock(&dev_lock);
    213257
    214         fseek(img, ba * block_size, SEEK_SET);
    215         n_wr = fread(buf, block_size, cnt, img);
     258        clearerr(img);
     259        rc = fseek(img, ba * block_size, SEEK_SET);
     260        if (rc < 0) {
     261                fibril_mutex_unlock(&dev_lock);
     262                return EIO;
     263        }
     264
     265        n_wr = fwrite(buf, block_size, cnt, img);
    216266
    217267        if (ferror(img) || n_wr < cnt) {
    218268                fibril_mutex_unlock(&dev_lock);
    219269                return EIO;     /* Write error */
     270        }
     271
     272        if (fflush(img) != 0) {
     273                fibril_mutex_unlock(&dev_lock);
     274                return EIO;
    220275        }
    221276
Note: See TracChangeset for help on using the changeset viewer.