using lseek( )

how can i use a for loop to traverse bit_map[i] array and finds the next available free bitmap position using lseek( )?
Note: i use man lseek page but the concept is still not very clear to me can an expert help out?
achille67Asked:
Who is Participating?
 
Karl Heinz KremerCommented:
You first need to open a file, then you call lseek to position the read/write pointer (which one it is depends on wether you've opened the file in read or write mode):


    int fd;

    fd = open("/path/to/file", O_RDONLY);
    lseek(fd, 1000, SEEK_SET);

This sets the read pointer to the position 1000 in the file. You can find out more about these calls in th eman pages:

man 2 lseek
man 2 open


... but, this has very likely nothing to do with your problem ... What exactly are you trying to accomplish? Do you already have code for your bit_map array? If so, please show it to illustrate your problem.

0
 
jlevieCommented:
lseek() is only used to position the read/write pointer to a file at a speciffied offset. It doesn't operate on arrays.
0
 
achille67Author Commented:
Oh ok, so how do i use position a read/write pointer?
0
 
achille67Author Commented:
Thanks khkremer,

The following code is simply importing linux_file from my linux file system to
to u_file residing in my own file system i just create by running the command:
./userfs -reformat 800000 file.system
At some point of the implementation of of u_import, i want to find
next free available free bitmap in bit_map[i] array  and position lseek to that place with  lseek(virtual_disk,BLOCK_SIZE_BYTES,SEEK_SET);
NOTE: u_import is a function of an entire file system homework(you may take a look at it at:  http://www.clarkson.edu/~jnm/os/homework/userfs/fs.htm)

int u_import(char* linux_file, char* u_file)
{
        int free_space;
        int num_block;
        struct stat st;
        int file_size=0;
        int remainder=0;
        int i;
        int j;

        free_space = u_quota();

        handle = open(linux_file,O_RDONLY);
        if ( -1 == handle ) {
                printf("error, reading file %s\n",linux_file);
                return 0;
        }

        fstat(handle,&st);
        file_size=(int)st.st_size;
        num_block=(int)file_size/BLOCK_SIZE_BYTES;
        if((num_block*BLOCK_SIZE_BYTES)!=file_size)
          {
            num_block++;
            remainder=file_size-(num_block*BLOCK_SIZE_BYTES);
          }
     for(i=0;i<num_block;i++)
          {
            lseek(handle,BLOCK_SIZE_BYTES*i,SEEK_SET);
             read(handle,&buffer,BLOCK_SIZE_BYTES);


             //      crash_write(virtual_disk, bit_map, sizeof(BIT)*BIT_MAP_SIZE );

             // bit_map[i] array and finds the next available free bitmap
             //position lseek to that place with
                     for (j=0; j< BIT_MAP_SIZE; j++){
             assert( free_space >= 1);
               allocate_block(i);

                 lseek(virtual_disk,BLOCK_SIZE_BYTES,SEEK_SET);

                     }
                     .
                     .
                     .
                      return 1;
}
0
 
stefan73Commented:
Hi achille67,
I see that you use int for calculating offsets. That will very likely cause problems, as offsets should be 64 bits. Define an unsigned type which you use for FS block/seek oprations, like

typedef uint32_t fs_block_t; /* For storing block numbers */
typedef uint64_t fs_seek_t;  /* For seeking in files      */

The system offers the off_t type for seeks which you can also use.

Cheers,
Stefan
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.