user34537
user34537

Reputation:

How do I read/write a block device?

How do I read/write a block device? I heard I read/write like a normal file so I setup a loop device by doing

sudo losetup /dev/loop4 ~/file

Then I ran the app on the file then the loop device

sudo ./a.out file
sudo ./a.out /dev/loop4

The file executed perfectly. The loop device reads 0 bytes. In both cases I got FP==3 and off==0. The file correctly gets the string length and prints the string while the loop gets me 0 and prints nothing

How do I read/write to a block device?

#include <fcntl.h>
#include <cstdio>
#include <unistd.h>

int main(int argc, char *argv[]) {
    char str[1000];

    if(argc<2){
        printf("Error args\n");
        return 0;
    }

    int fp = open(argv[1], O_RDONLY);
    printf("FP=%d\n", fp);
    if(fp<=0) {
        perror("Error opening file");
        return(-1);
    }
    off_t off = lseek(fp, 0, SEEK_SET);
    ssize_t len = read(fp, str, sizeof str);
    str[len]=0;
    printf("%d, %d=%s\n", len, static_cast<int>(off), str);

    close(fp);
}

Upvotes: 10

Views: 9512

Answers (2)

vasha
vasha

Reputation: 136

You can not put zeros or random values on the file to get 512 byte alignment. Use the first few byte to store the file size, followed by the file content. Now you know where the file content is ending. You put random data to achieve the 512 alignment.

e.g. File structure:

[File Size] [Data][<padding to get 512 alignment>]

Upvotes: 0

ymonad
ymonad

Reputation: 12090

The losetup seems to map file in 512-byte sectors. If file size is not multiples of 512, then the rest will be truncated.

When mapping a file to /dev/loopX with losetup, for fiile which is smaller than 512 bytes it gives us following warning:

Warning: file is smaller than 512 bytes;
 the loop device may be useless or invisible for system tools.

For file which the size cannot be divided by 512:

Warning: file does not fit into a 512-byte sector;
 the end of the file will be ignored

This warning was added since util-linux ver 2.22 in this commit

Upvotes: 7

Related Questions